如何在模拟弹出窗口的模糊效果时为屏幕截图创建蒙版图像

时间:2014-08-12 18:27:50

标签: ios objective-c ios7 uiimage uipopovercontroller

我已成功为运行iOS 7的iPhone上运行的应用程序实现了模糊效果。我使用了Apple提供的示例代码UIImage+ImageEffects category。当我提出模态演示文稿时,我会在prepareForSegue中截取屏幕截图并应用效果,然后将UIImage传递给destinationViewController。在新视图控制器的viewDidLoad中,我只是将背景设置为存储图像的背景。

//prepareForSegue
UIImage *imageOfUnderlyingView = [UIImage snapshotImageWithView:[[UIApplication sharedApplication] keyWindow]];
destinationVC.imageOfUnderlyingView = [imageOfUnderlyingView applyBlurWithRadius:15
                                                                       tintColor:[UIColor redColor]
                                                           saturationDeltaFactor:1.2
                                                                       maskImage:nil];

//category method to take the snapshot
+ (UIImage *)snapshotImageWithView:(UIView *)view {
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0f);
    [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:NO];
    UIImage *snapshotImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return snapshotImage;
}

//viewDidLoad on the presented view controller
self.tableView.backgroundView = [[UIImageView alloc] initWithImage:self.imageOfUnderlyingView];

这非常有效,因为我提供的视图控制器是全屏的,因此整个屏幕可以模糊并应用于背景。但是现在我正在为iPad优化应用程序,这不起作用,因为我不再提供全屏视图控制器,而是作为弹出窗口(或者仍然是模态但是作为表单)。在这种情况下,快照图像缩小并伸展以适应弹出窗口,这使得效果无效,因为它不显示弹出窗口后面的内容,而是整个屏幕的非常奇怪的快照。

我的问题是,如何在呈现弹出窗口时模拟底层视图的模糊效果,正确显示弹出窗口后面的内容,而不是缩小整个屏幕以适应弹出窗口?

我注意到有一个maskImage可以传入方法来生成效果。我怎么能创建一个面具来切断popover的正确区域?或许另一种方法是改变它调整图像的方式,使其不会缩小,而是在没有调整大小的情况下重叠,因此只显示正确的区域并隐藏图像的其余部分,如果这样的话可能。或任何其他方法,任何使其工作的方法。 :)

请注意,我将在未来使用iOS 8本机API来实现此效果,但我现在想模拟它以与iOS 7一起使用。

1 个答案:

答案 0 :(得分:0)

我最终决定了我想要实现的目标几乎是不可能的,因为在旋转设备时,popover将重新定位,因此不同的UI将位于其下方,并且在此popover中导航也可以调整popover的大小。所以我决定,如果它是运行iOS 7的iPad,那么它只能获得坚实的背景颜色。

但如果它是运行iOS 8的iPad,那么我支持原生的UIBlurEffect API非常好。 :)