Skip to content

iOS: headerLargeTitle mirrors RTL (Arabic/Hebrew) title glyphs when direction is forced RTL #4280

Description

@alphanamko

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.mmapplySemanticContentAttributeIfNeededToNavCtrl: 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

  1. I18nManager.forceRTL(true) (or run on an Arabic/Hebrew device).
  2. A native-stack screen with headerLargeTitle: true and an RTL-script title (e.g. Arabic «الإشعارات»).
  3. 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).

Metadata

Metadata

Assignees

No one assigned

    Labels

    platform:iosIssue related to iOS part of the librarytype:bugSomething isn't working

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions