为啥 iOS 11 中 Navigation backBarButtonItem 的位置出现了三个按钮?

Posted

技术标签:

【中文标题】为啥 iOS 11 中 Navigation backBarButtonItem 的位置出现了三个按钮?【英文标题】:Why three buttons are appearing in the place of Navigation backBarButtonItem in iOS 11?为什么 iOS 11 中 Navigation backBarButtonItem 的位置出现了三个按钮? 【发布时间】:2017-09-25 11:47:15 【问题描述】:

我设置了 UINavigation 栏的外观,如下所示,

代码:

fileprivate class func barButtonAppearance() 
    var attributes = [String : AnyObject]()
    attributes[NSFontAttributeName] = UIFont(name: .Regular, size: 14)
    attributes[NSForegroundColorAttributeName] = UIColor.descriptionColor()
    UIBarButtonItem.appearance().setTitleTextAttributes(attributes, for: UIControlState())

    let backImage =  UIImage.image(assetID: .NavigationBarBack, caps: UIEdgeInsetsMake(0, 23, 0, 0)).withRenderingMode(.alwaysTemplate)
    UIBarButtonItem.appearance().setBackButtonBackgroundImage(backImage, for: .normal, barMetrics: .default)

    UINavigationBar.appearance().backIndicatorTransitionMaskImage = backImage

在我们在 ios 11 中测试我们的应用程序之前,它一直运行良好。

如果我评论下面的代码

let backImage =  UIImage.image(assetID: .NavigationBarBack, caps: UIEdgeInsetsMake(0, 23, 0, 0)).withRenderingMode(.alwaysTemplate)
UIBarButtonItem.appearance().setBackButtonBackgroundImage(backImage, for: .normal, barMetrics: .default)

它工作正常,但默认苹果返回按钮。

这是出现的导航栏的屏幕截图,

我无法了解正在发生的事情。有人可以建议我解决方法吗?谢谢。

【问题讨论】:

祝你好运。我也遇到了同样的问题 没有。我以不同的方式处理它。我添加了一个左侧导航按钮,并在 BaseViewController 中有一个常用方法来弹出 ViewControllers。 我找到了方法,请查看我的答案。它适用于所有 ios 版本。 【参考方案1】:
UINavigationBar.appearance().backIndicatorImage = image.withRenderingMode(.alwaysOriginal)
UINavigationBar.appearance().backIndicatorTransitionMaskImage = image.withRenderingMode(.alwaysOriginal)

if #available(iOS 11, *) 
    UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
    UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .highlighted)
 else 
    UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffset(horizontal: -60, vertical: -60), for: .default)

图像是 UIImage。无需在每个控制器上创建基本控制器或编写代码。只需将这些行放在应用程序委托中即可。

【讨论】:

【参考方案2】:

你可以使用这个方法:

func addBackButton() 
    let leftButton = UIBarButtonItem(image: Asset.backIco, style: UIBarButtonItemStyle.Plain, target: self, action: #selector(self.popViewControllerAnimated(_:)))
    self.navigationItem.leftBarButtonItem = leftButton

粘贴到扩展 UIViewController 中

【讨论】:

以上是关于为啥 iOS 11 中 Navigation backBarButtonItem 的位置出现了三个按钮?的主要内容,如果未能解决你的问题,请参考以下文章

React Navigation:Android 上类似于 iOS 的 Modal Stack

Navigation Drawer - syncState() 做啥以及为啥应该在 onPostCreate() 中调用它?

iOS -- 解决iOS11中navigationBar上使用initWithCustomView按钮图片错位 frame无效

Android Studio navigation 一直在Loading为啥?

iOS11中navigationBar上 按钮图片设置frame无效 不受约束 产生错位问题 解决

undefined 不是对象(评估“navigation.mediaDevices.getUserMedia”)