通过UIPopoverControllerclosures调光

在iOS7中,popup窗口会导致屏幕的其余部分变暗。 按照苹果文档 :

popup窗口内容分层放置在现有内容之上,背景会自动变暗。

这在大多数情况下都很好,但是我有一个应用程序,当popover打开并保持响应时,屏幕重新排列,所以调暗只会引起混淆。 任何人都知道如果调光可以禁用?

看起来在API中没有任何东西可以支持 – 你可以设置passthroughViews属性来允许其他视图在popover打开的时候与之交互,但是这不影响调光。 您可能不得不推出自己的popover实现或查找第三方版本。

我可以build议你一个自定义控件,它的作者是非常好的工作。 它不会使背景变暗。 进一步它有许多定制。

这是WYPopoverController的github链接

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

您将需要重新实现popup窗口绘制箭头的方式,但您可以在线查找大量示例。

对于我这样的作品 我只是通过所有的子视图工作,如果关键窗口视图,find_UIMirrorNinePatchView。 _UIMirrorNinePatchView是具有四个图像视图的苹果类,这些图像视图为PopOverPresentationController的4个方向创build了调光背景。 更具体地说,如果你使用视图层次结构debugging器,你可以看看这个。 所以我走过这些UIImageView的数组,并设置UIImage为零。 此代码粘贴在您的目标控制器(popOverContoller)的viewWillAppear中。

 NSArray<UIView *> *arrayOfSubviews = [UIApplication sharedApplication].keyWindow.subviews.lastObject.subviews; for (int i = 0; i < arrayOfSubviews.count; i++) { if ([NSStringFromClass(arrayOfSubviews[i].class) isEqualToString:@"_UIMirrorNinePatchView"]) { arrayOfSubviews[i].backgroundColor = [UIColor clearColor]; NSArray<UIImageView *> *arrayOfImageViews = arrayOfSubviews[i].subviews; for (int j = 0; j < arrayOfImageViews.count; j++) { arrayOfImageViews[j].image = nil; } } } 

整个我的UIPopOverController看起来像这样 风景 而在debugging器中,它看起来是如此 查看调试器

所以你可以理解,将UIImage设置为零将消除这个调光视图。

这是删除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 } } } 

如果select实现自定义UIPopoverBackgroundView ,则可以将图层背景设置为clear – layer.shadowColor = UIColor.clearColor().CGColor 。 然而,这将完全消除昏暗和阴影,所以你将不得不在控制器周围放置一个边框