【发布时间】:2014-10-05 22:45:09
【问题描述】:
我已经成功地为我在运行 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 可以传入该方法来生成效果。我怎样才能创建一个遮罩来为弹出框切出适当的区域?或者,另一种方法可能是改变调整图像以使其适合的方式,使其不会缩小,而是在不调整大小的情况下覆盖,因此只显示正确的区域并隐藏图像的其余部分,如果那样的话可能的。或任何其他方法,任何使它起作用的方法。 :)
请注意,我将来会使用 iOS 8 原生 API 来实现此效果,但我想现在模拟它以与 iOS 7 一起使用。
【问题讨论】:
标签: ios objective-c ios7 uiimage uipopovercontroller