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

时间:2017-12-11 13:54:20

标签: ios swift uinavigationbar ios11.2

在我的应用程序中,我有多个视图控制器,并且大多数都有一个右侧UIBarButtonItem,附带了直接的“show”segue操作。

连接到另一个视图,然后按下'< Back'按钮,原始按钮项目仍然淡出,但仍然可以使用。

这似乎只发生在iOS 11.2下。

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

4 个答案:

答案 0 :(得分:38)

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

要避免此行为,请

  1. 使用UIBarButtonItem UIButton作为自定义视图

  2. 禁用并重新启用viewWillDisappear(_:)中的小节按钮项(虽然这会导致按钮立即显示,但请使用matt's solution来避免这种情况):

    barButtonItem.isEnabled = false
    barButtonItem.isEnabled = true
    

答案 1 :(得分:24)

我所做的是在视图控制器的viewWillAppear中解决此错误,如下所示:

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

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

答案 2 :(得分:5)

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

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

<强>夫特

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

<强>目标C

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

答案 3 :(得分:2)

我解决了这个问题:

override func viewWillDisappear(_ animated: Bool) {
    navigationController?.navigationBar.tintAdjustmentMode = .normal
    navigationController?.navigationBar.tintAdjustmentMode = .automatic
}

所以它会在其他视图出现之前恢复颜色