iOS UINavigationBar 按钮在 segue 返回后保持淡出状态

iOS UINavigationBar button remains faded after segue back

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

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

这似乎只发生在 iOS 11.2.

我看不到任何可以执行此操作的设置,并且至少在发生这种情况的一种情况下,没有特定的 segue 展开,也没有 viewDidAppear 处理。我会 post 一些代码,但 AFAICS 都是默认的 UINavigationBar 行为。

这是 iOS 11.2 中的一个错误,发生的原因是 UIBarButtonItem 在导航后保持高亮状态,而在其他视图控制器弹出后 return 没有恢复到正常状态。

要避免这种行为,

  1. 使用 UIBarButtonItemUIButton 作为自定义视图

  2. 禁用并重新启用 viewWillDisappear(_:) 中的栏按钮项(虽然这会导致按钮立即出现,但使用 可以避免这种情况):

    barButtonItem.isEnabled = false
    barButtonItem.isEnabled = true
    

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

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

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

另一种解决方法是在父导航控制器上实施修复 - 以便它的每个子 viewController 都得到如下修复

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

Swift

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

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;
    }
}

我是这样解决的:

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

所以它会在另一个视图出现之前恢复颜色