我的应用程序中有多个视图控制器,大多数都有一个右侧的UIBarButtonItem
,附有直接的“show”segue操作。
切换到另一个视图,然后按下“< 返回”按钮后,原始按钮项仍保持淡出状态,但仍可使用。
这只在iOS 11.2下出现。
我找不到任何可能导致此问题的设置,在其中至少有一种情况下,没有特定的segue unwinding或viewDidAppear
处理。我会发一些代码,但 AFAICS 它们都是默认的UINavigationBar
行为。
我的应用程序中有多个视图控制器,大多数都有一个右侧的UIBarButtonItem
,附有直接的“show”segue操作。
切换到另一个视图,然后按下“< 返回”按钮后,原始按钮项仍保持淡出状态,但仍可使用。
这只在iOS 11.2下出现。
我找不到任何可能导致此问题的设置,在其中至少有一种情况下,没有特定的segue unwinding或viewDidAppear
处理。我会发一些代码,但 AFAICS 它们都是默认的UINavigationBar
行为。
这是iOS 11.2中的一个错误,因为UIBarButtonItem
在导航后保持高亮状态,且在其他视图控制器弹出后未返回到正常状态。
为避免这种行为,请执行以下操作之一:
使用带有UIButton
的UIBarButtonItem
作为自定义视图
在viewWillDisappear(_:)
中禁用并重新启用工具栏按钮项(尽管这会导致按钮立即出现,但使用Matt的解决方案来避免此问题):
barButtonItem.isEnabled = false barButtonItem.isEnabled = true
viewDidAppear()
方法中重置按钮状态是否也可能? - AlnitakviewWillDisappear(_:)
中执行,则当视图弹出时按钮立即可见。如果我在 viewDidAppear(_:)
中执行,则它会以动画方式重新显示。 - AlnitakviewDidDisappear
中翻转启用状态,而不是在 viewWillDisappear
中。没有视觉残留。 - jab我的做法是在视图控制器的viewWillAppear
中解决这个 bug,具体如下:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.navigationBar.tintAdjustmentMode = .normal
self.navigationController?.navigationBar.tintAdjustmentMode = .automatic
}
这似乎可以在没有视觉瑕疵的情况下唤醒按钮。
另一个解决方法是在父级navigationController上实现修复 - 这样它的每个子viewController都会得到修复,具体如下
注意:这需要接收类设置为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;
}
}
popViewController(_)
返回到相关视图时,我无法让这个(或任何其他解决方法)起作用。有人遇到同样的问题吗? - Linus Unnebäck
override func viewWillDisappear(_ animated: Bool) {
navigationController?.navigationBar.tintAdjustmentMode = .normal
navigationController?.navigationBar.tintAdjustmentMode = .automatic
}
因此,在其他视图出现之前,它将恢复颜色。