我已成功为运行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一起使用。
答案 0 :(得分:0)
我最终决定了我想要实现的目标几乎是不可能的,因为在旋转设备时,popover将重新定位,因此不同的UI将位于其下方,并且在此popover中导航也可以调整popover的大小。所以我决定,如果它是运行iOS 7的iPad,那么它只能获得坚实的背景颜色。
但如果它是运行iOS 8的iPad,那么我支持原生的UIBlurEffect
API非常好。 :)