44

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

切换到另一个视图然后按下'< Back'按钮后,原始按钮项仍然淡出,尽管在其他方面仍然可用。

这似乎只在 iOS 11.2 下发生。

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

4

4 回答 4

37

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

为了避免这种行为,要么

  1. 使用 aUIBarButtonItem和 aUIButton作为自定义视图

  2. 禁用并重新启用 bar 按钮项viewWillDisappear(_:)(尽管这会导致按钮立即出现,但使用matt 的解决方案来避免这种情况):

    barButtonItem.isEnabled = false
    barButtonItem.isEnabled = true
    
于 2017-12-11T14:03:17.810 回答
24

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

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

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

于 2017-12-15T20:47:54.020 回答
5

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

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

迅速

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;
    }
}
于 2017-12-28T04:39:45.647 回答
2

我是这样解决的:

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

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

于 2018-01-12T13:27:20.260 回答