【问题标题】:Controls not dimming when view controller is presented locally and alert displayed当视图控制器在本地显示并显示警报时控件不变暗
【发布时间】:2019-10-18 11:20:15
【问题描述】:

当我在视图控制器上显示 UIAlertController 时,控件按预期变暗。

但是,如果同一个视图控制器本身以模态方式呈现,则警报控制器的显示不会使控件变暗(两个按钮保持蓝色)。

如何使呈现的视图控制器本身正确处理演示,并使其控件变暗?

Here 是一个小示例项目。相关代码在MainViewController.swift

【问题讨论】:

  • 我不知道它们为什么不调暗,但如果必须的话,很容易自己调暗。 developer.apple.com/documentation/uikit/uiview/…
  • 谢谢,我的问题是为什么他们自动变暗以及如何让他们这样做 - 我知道解决方法。我不认为每次我呈现任何非全屏内容时手动将tintAdjustmentMode 设置为dimmed 是可扩展的,然后再返回。我可以通过一些自定义控件或一些嵌套视图控制器来理解它。但这是一个应该“正常工作”的微不足道的例子,对吧?我希望对这个 API 有更透彻的了解,而不仅仅是快速修复。
  • 还应注意,当警报源自操作系统时,例如当显示相机权限警报时,调暗自己的视图并不简单。

标签: ios cocoa-touch uiviewcontroller


【解决方案1】:

到目前为止,我最好的解决方法是使用自定义的UIAlertController 子类来设置tintAdjustmentMode 及其出现/消失动画,使用transitionCoordinator

/// A `UIAlertController` that can udpates its presenting view controller's `tintAdjustmentMode` code as it appears and disappears
class TintAdjustingAlertController: UIAlertController {
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        animatePresentingViewTintAdjustmentMode(tintAdjustmentMode: .dimmed, forViewControllerAtKey: .from)
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)

        animatePresentingViewTintAdjustmentMode(tintAdjustmentMode: .automatic, forViewControllerAtKey: .to)
    }

    private func animatePresentingViewTintAdjustmentMode(tintAdjustmentMode mode: UIView.TintAdjustmentMode, forViewControllerAtKey key: UITransitionContextViewControllerKey) {
        transitionCoordinator?.animate(alongsideTransition: { context in
            if let presentingNavigationController = context.viewController(forKey: key) as? UINavigationController {
                presentingNavigationController.navigationBar.tintAdjustmentMode = mode
                presentingNavigationController.viewControllers.forEach { $0.view.tintAdjustmentMode = mode }
            } else if let presentingViewController = context.viewController(forKey: key) {
                presentingViewController.view.tintAdjustmentMode = mode
            }
            }, completion: nil)
    }
}

这可行,但我希望不必在我的代码中添加它。仍然很想知道 a) 是否有一种简单的方法可以使其按预期工作,或者 b) 如果这确实是 iOS 错误,是否有更优雅的解决方法?

我也为此提交了一个雷达:http://www.openradar.me/radar?id=6113750608248832

【讨论】:

    猜你喜欢
    • 2020-10-02
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多