【问题标题】:iOS UINavigationBar button remains faded after segue back转回后iOS UINavigationBar按钮仍然褪色
【发布时间】:2017-12-11 13:54:19
【问题描述】:

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

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

这似乎只在 iOS 11.2 下发生。

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

【问题讨论】:

  • 希望你对这个可怕的、可怕的错误提出雷达。
  • 看起来这在 iOS 11.3 中已解决

标签: ios swift uinavigationbar ios11.2


【解决方案1】:

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

为了避免这种行为,要么

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

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

    barButtonItem.isEnabled = false barButtonItem.isEnabled = true

【讨论】:

  • 感谢您的回复。是否也可以在viewDidAppear() 方法中重置按钮的状态?
  • @Alnitak 我在答案中添加了第二个选项,它以不同的方式解决了这个问题。
  • 谢谢 - 两者似乎都有效,我不确定哪个更吸引人。如果我在viewWillDisappear(_:) 中执行此操作,则该按钮在视图弹出时立即可见。如果我在 viewDidAppear(_:) 中执行此操作,那么它会以动画方式恢复可见性。
  • 附注如果您知道任何指向此行为的其他报告的链接,这将非常有用
  • 您也可以在viewDidDisappear而不是viewWillDisappear中翻转启用状态。没有视觉伪影。
【解决方案2】:

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

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

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

【讨论】:

  • 当用户使用边缘手势向后滑动时,它不起作用。尝试了 viewDidAppear 并且它可以工作,但是当我们使用按钮返回时,视图的出现会有一点延迟。有什么想法可以改进吗?
  • 谢谢!这对我有用。既用于单击后退按钮又用于滑动。
【解决方案3】:

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

注意:这需要将接收类设置为 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;
    }
}

【讨论】:

  • 不确定我是否做错了什么,但是当我使用popViewController(_) 返回相关视图时,我无法让这个(或任何其他解决方法)工作。有没有人遇到同样的情况?
【解决方案4】:

我是这样解决的:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 2011-01-07
    相关资源
    最近更新 更多