Swift 本地化时如何禁止导航栏 bar button items 自动翻转位置
解决方案
方案1:强制当前视图控制器导航栏全局不跟随语言方向翻转
如果需要整个导航栏的所有元素(按钮、搜索栏)都固定布局方向,直接对导航栏本身设置语义属性即可,之前设置不生效通常是因为仅修改了导航控制器的根视图属性,没有同步修改导航栏的属性:
// Swift 代码,在当前视图控制器的 viewDidLoad 或语言切换回调中添加 // 强制导航栏布局保持从左到右,如需固定从右到左可改为 .forceRightToLeft navigationController?.navigationBar.semanticContentAttribute = .forceLeftToRight // 同步设置导航控制器根视图属性,保证内部层级布局统一 navigationController?.view.semanticContentAttribute = .forceLeftToRight // 强制刷新布局 navigationController?.navigationBar.layoutIfNeeded()
Objective-C 版本:
// Objective-C 代码 self.navigationController.navigationBar.semanticContentAttribute = UISemanticContentAttributeForceLeftToRight; self.navigationController.view.semanticContentAttribute = UISemanticContentAttributeForceLeftToRight; [self.navigationController.navigationBar layoutIfNeeded];
方案2:仅固定指定Bar Button Item的位置,不影响其他元素本地化
如果只需要固定侧边栏菜单按钮的位置,不需要修改整个导航栏的布局逻辑,可以通过自定义View包裹按钮的方式实现(UIBarButtonItem本身不是视图子类,没有语义属性,通过自定义View即可单独控制布局方向):
// Swift 示例代码 // 1. 创建自定义菜单按钮 let menuButton = UIButton(type: .system) menuButton.setImage(UIImage(systemName: "line.3.horizontal"), for: .normal) menuButton.addTarget(self, action: #selector(openSideMenu), for: .touchUpInside) menuButton.frame = CGRect(x: 0, y: 0, width: 30, height: 30) // 2. 强制按钮布局不跟随语言方向翻转 menuButton.semanticContentAttribute = .forceLeftToRight // 3. 封装为UIBarButtonItem添加到导航栏对应位置 let menuBarItem = UIBarButtonItem(customView: menuButton) navigationItem.leftBarButtonItem = menuBarItem
注意事项
- 如果你的应用是手动切换内部语言而非跟随系统语言,需要在语言切换的回调方法中重新执行上述设置代码,触发导航栏重新渲染
- 侧边栏弹出视图也需要同步设置semanticContentAttribute,保证弹出位置和按钮位置统一
内容的提问来源于stack exchange,提问作者abdallah eslah
相关产品推荐
相关产品推荐

