Description
On iOS, a native-stack screen with headerLargeTitle: true renders the large-title text horizontally mirrored (glyphs flipped) when the layout direction is RTL (I18nManager.isRTL === true). The regular (non-large) title in the same bar renders correctly, as do the bar buttons — only the large title is mirrored.
Root cause (traced)
RNSScreenStackHeaderConfig.mm → applySemanticContentAttributeIfNeededToNavCtrl: sets:
navCtrl.navigationBar.semanticContentAttribute = self.direction; // forceRightToLeft
[[UIView appearanceWhenContainedInInstancesOfClasses:@[navCtrl.navigationBar.class]]
setSemanticContentAttribute:self.direction];
Forcing forceRightToLeft on the navigation bar makes UIKit apply a horizontal-flip transform to the large-title container, mirroring the title glyphs. The regular title is centered/handled differently and is unaffected. The block only runs when direction is explicitly forced (navCtrl.view.semanticContentAttribute != self.direction).
Reproduction
I18nManager.forceRTL(true) (or run on an Arabic/Hebrew device).
- A native-stack screen with
headerLargeTitle: true and an RTL-script title (e.g. Arabic «الإشعارات»).
- The large title renders mirrored.
headerLargeTitle: false renders it correctly.
Confirmed on an Arabic-language simulator (not just forced-RTL-on-LTR), so it affects real RTL-locale devices.
Environment
react-native-screens 4.25.2, RN 0.85, iOS, New Architecture, expo-router 56.
Workaround
Use standard (non-large) titles under RTL. Filing so large titles can be re-enabled once the large-title container's mirror is corrected (e.g. resetting the large-title label's semanticContentAttribute while keeping the bar buttons' RTL layout).
Description
On iOS, a native-stack screen with
headerLargeTitle: truerenders the large-title text horizontally mirrored (glyphs flipped) when the layout direction is RTL (I18nManager.isRTL === true). The regular (non-large) title in the same bar renders correctly, as do the bar buttons — only the large title is mirrored.Root cause (traced)
RNSScreenStackHeaderConfig.mm→applySemanticContentAttributeIfNeededToNavCtrl:sets:Forcing
forceRightToLefton the navigation bar makes UIKit apply a horizontal-flip transform to the large-title container, mirroring the title glyphs. The regular title is centered/handled differently and is unaffected. The block only runs whendirectionis explicitly forced (navCtrl.view.semanticContentAttribute != self.direction).Reproduction
I18nManager.forceRTL(true)(or run on an Arabic/Hebrew device).headerLargeTitle: trueand an RTL-script title (e.g. Arabic «الإشعارات»).headerLargeTitle: falserenders it correctly.Confirmed on an Arabic-language simulator (not just forced-RTL-on-LTR), so it affects real RTL-locale devices.
Environment
react-native-screens 4.25.2, RN 0.85, iOS, New Architecture, expo-router 56.
Workaround
Use standard (non-large) titles under RTL. Filing so large titles can be re-enabled once the large-title container's mirror is corrected (e.g. resetting the large-title label's semanticContentAttribute while keeping the bar buttons' RTL layout).