在我的应用程序中,我有多个视图控制器,并且大多数都有一个右侧UIBarButtonItem
,附带了直接的“show”segue操作。
连接到另一个视图,然后按下'< Back'
按钮,原始按钮项目仍然淡出,但仍然可以使用。
这似乎只发生在iOS 11.2下。
我看不到任何设置可能会这样做,并且在至少一个发生这种情况的情况下,没有特定的segue展开和viewDidAppear
处理。我发布了一些代码,但AFAICS只是默认的UINavigationBar
行为。
答案 0 :(得分:38)
这是iOS 11.2中的一个错误,因为UIBarButtonItem
在导航后保持突出显示,并且在其他视图控制器弹出后不会返回到正常状态。
要避免此行为,请
使用UIBarButtonItem
UIButton
作为自定义视图
禁用并重新启用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
}
所以它会在其他视图出现之前恢复颜色