2013-12-12 106 views
2

在iOS7中,弹出导致屏幕的其余部分变暗。按照the Apple docs通过UIPopoverController关闭调光

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

这在大多数情况下很不错,但我有一个应用程序,当弹出窗口打开并保持响应时,屏幕重新排列,因此调光只会导致混淆。任何人都知道如果调光可以禁用?

回答

3

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

+0

谢谢。它太小,不足以保证激进的替代品,但仍然令人讨厌。当'passthroughViews'被定义时,它似乎会更好地避免变暗,我不知道是否应该打开雷达。 – Clafou

+3

以防万一 - rdar://问题/ 15655432 http://openradar.appspot.com/15655432 – Clafou

2

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

这里是GitHub的链接WYPopoverController

+0

iOS 6 style ...:/ – aehlke

1

你可以为你的酥料饼的设置UIPopoverBackgroundView和设置的背景是透明的背景视图防止调光。

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

0

如果您选择实施自定义UIPopoverBackgroundView,则可以将图层背景设置为清除 - layer.shadowColor = UIColor.clearColor().CGColor。 但是,这将完全消除昏暗和阴影,所以你将不得不把边框放在控制器周围

1

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

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看起来像这样 The view ,并考虑调试器,这样看上去 View debugger

所以你可以理解,UIImage的设置为nil,将删除该调光视图。

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