通过UIPopoverController关闭调光

时间:2013-12-12 17:46:29

标签: ios ipad ios7 uipopovercontroller

在iOS7中,弹出窗口会使屏幕的其余部分变暗。根据{{​​3}}:

  

弹出窗口内容位于现有内容之上,背景会自动变暗。

在大多数情况下这很不错,但我有一个应用程序,当弹出窗口打开并保持响应时屏幕重新排列,因此调暗只会引起混乱。有人知道是否可以禁用调光?

8 个答案:

答案 0 :(得分:4)

看起来API中没有任何内容可以支持 - 您可以设置passthroughViews属性以允许其他视图在弹出窗口打开时进行交互,但这不会影响调光。您可能必须推出自己的popover实现或查找第三方版本。

答案 1 :(得分:2)

我可以建议你一个自定义控件,这是作者非常好的作品。它不会使背景变暗。此外,它还有很多定制。

以下是WYPopoverController

的github链接

答案 2 :(得分:2)

对我这样的作品。我只是通过所有子视图,如果关键窗口视图,找到_UIMirrorNinePatchView。 _UIMirrorNinePatchView是苹果类,有四个图像视图,这些图像视图为PopOverPresentationController的4个方向创建调光背景。更具体地说,如果使用视图层次结构调试器,则可以查看此内容。所以我浏览了这些UIImageView的数组并将UIImage设置为nil。此代码粘贴在目标控制器的viewWillAppear中(popOverContoller)。

public IActionResult viewData()
{
    var currentUser = this.User.FindFirstValue(ClaimTypes.NameIdentifier);

    var vm = new myViewModel();
    vm.myBuildings = (from mb in db.buildings where mb.OwnerId == currentUser select mb).ToList();
    vm.myAnswers = (from o in db.answers select o).ToList();
    vm.myCheckpoints = (from mc in db.checks select mc).ToList();
    var lstVm = new List<myViewModel>();
    lstVm.Add(vm);
    return View(lstVm);
}

整个我的UIPopOverController看起来像这样 The view 在视图调试器中,它看起来如此 View debugger

您可以理解,将UIImage设置为nil将删除此调光视图。

答案 3 :(得分:1)

您可以通过设置弹出窗口的UIPopoverBackgroundView并将背景设置为背景视图的透明来防止变暗。

你需要重新实现popover绘制箭头的方式,但是你可以在网上找到很多这样的例子。

答案 4 :(得分:1)

这是删除UIPopoverController调光的快速版本

let allSubViews: [UIView] = (UIApplication.shared.keyWindow?.subviews.last?.subviews)!

        for index in 0...allSubViews.count - 1 {
            allSubViews[index].removeFromSuperview()
                        if NSStringFromClass(allSubViews[index].classForCoder) == "_UIMirrorNinePatchView"
                        {
                            allSubViews[index].backgroundColor = UIColor.clear

                            let arrayofImages = allSubViews[index].subviews as! [UIImageView]

                            for imageIndex in 0...arrayofImages.count - 1 {
                                arrayofImages[imageIndex].image = nil
                            }
                        }
        }

答案 5 :(得分:0)

如果您选择实施自定义UIPopoverBackgroundView,则可以将图层背景设置为清除 - layer.shadowColor = UIColor.clearColor().CGColor。 然而,这将完全消除暗淡和阴影,因此您必须在控制器周围放置边框

答案 6 :(得分:0)

已更新为可在带有Swift 4的iOS 13中使用

    guard let transitionSubviews = UIApplication.shared.keyWindow?.subviews.last?.subviews else { return }

    func findViews<T>(inView view: UIView, subclassOf targetType: T.Type) -> [T] {
        return recursiveSubviews(inView: view).compactMap { $0 as? T }
    }

    func recursiveSubviews(inView view: UIView) -> [UIView] {
        return view.subviews + view.subviews.flatMap { recursiveSubviews(inView: $0) }
    }

    for view in transitionSubviews {
        view.backgroundColor = UIColor.clear
        for imageView in findViews(inView: view, subclassOf: UIImageView.self) {
            imageView.image = nil
        }
    }

答案 7 :(得分:0)

[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];

这解决了我的导航栏在运输过程中变暗的问题。