segue返回后,iOS UINavigationBar按钮仍然褪色

Aln*_*tak 44 uinavigationbar ios swift ios11.2

在我的应用程序中,我有多个视图控制器,大多数都有右侧,UIBarButtonItem附加了直接"显示"segue操作.

缝制到另一个视图然后按下'< Back'按钮,原始按钮项目仍然淡出,但仍然可用.

这似乎只发生在iOS 11.2下.

我看不到任何可以做到这一点的设置,并且在至少一个发生这种情况的情况下,没有特定的segue展开或viewDidAppear处理.我发布了一些代码,但AFAICS它只是默认UINavigationBar行为.

Tam*_*gel 37

这是iOS 11.2中的一个错误,因为UIBarButtonItem在导航后突出显示并且在其他视图控制器弹出后不会返回到正常状态.

为了避免这种行为,要么

  1. 使用UIBarButtonItem具有UIButton作为一个自定义视图

  2. 禁用并重新启用栏按钮项viewWillDisappear(_:)(虽然这会导致按钮立即显示,使用matt的解决方案来避免这种情况):

    barButtonItem.isEnabled = false
    barButtonItem.isEnabled = true
    


mat*_*att 24

我所做的是在视图控制器中解决这个bug,viewWillAppear如下所示:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.tintAdjustmentMode = .normal
    self.navigationController?.navigationBar.tintAdjustmentMode = .automatic
}
Run Code Online (Sandbox Code Playgroud)

这似乎唤醒了没有视觉伪影的按钮.


小智 5

另一个解决方法是在父navigationController上实现修复 - 以便它的每个子viewController获得如下修复

注意:这需要将接收类设置为UINavigationController委托

迅速

func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
    if #available(iOS 11.2, *) {
        navigationBar.tintAdjustmentMode = .normal
        navigationBar.tintAdjustmentMode = .automatic
    }
}
Run Code Online (Sandbox Code Playgroud)

Objective-C的

-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {    
    if (@available(iOS 11.2, *)) {
        self.navigationBar.tintAdjustmentMode = UIViewTintAdjustmentModeNormal;
        self.navigationBar.tintAdjustmentMode = UIViewTintAdjustmentModeAutomatic;
    }
}
Run Code Online (Sandbox Code Playgroud)