繁体   English   中英

当本地显示视图控制器并显示警报时,控件不会变暗

[英]Controls not dimming when view controller is presented locally and alert displayed

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

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

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

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

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

/// 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM