使用 iOS 7 的新截屏方法,一种返回不带状态栏的 UIImage,另一种返回带有状态栏的 UIView。如何模糊状态栏?
Posted
技术标签:
【中文标题】使用 iOS 7 的新截屏方法,一种返回不带状态栏的 UIImage,另一种返回带有状态栏的 UIView。如何模糊状态栏?【英文标题】:With iOS 7's new screenshot methods, one returns a UIImage without the status bar, one returns a UIView with it. How do I blur the status bar? 【发布时间】:2013-12-09 00:49:23 【问题描述】:我想模糊整个屏幕包括状态栏,然后在它上面显示一个 UIImageView,但事实证明这很困难。
ios 7 的屏幕截图方法drawViewHierarchyInRect:afterScreenUpdates:
返回一个非常容易模糊和呈现的 UIImage,但不包括状态栏(至少默认情况下),所以它不能像我希望的那样工作。另一个snapshotViewAfterScreenUpdates:
,返回一个带有状态栏的 UIView (耶!)但不幸的是,因为它是一个 UIView,我不知道如何模糊它。
我可以快速将 UIView 转换为 UIImage 以进行模糊处理吗?第一种方法可以以某种方式包含状态栏吗?我可以有效地模糊 UIView 吗?
我只是想模糊整个屏幕(包括状态栏)以在其顶部显示图像。如果我忽略了其他方式,请随时提及。
【问题讨论】:
【参考方案1】:您是否尝试过在您的应用窗口中调用drawViewHierarchyInRect:afterScreenUpdates:
?窗口/应该/包含状态栏。从那里您获得图像,然后应用您想要的任何效果。
【讨论】:
为什么主窗口要包含状态栏?状态栏在一个完全不同的窗口中。 确实不包括状态栏。 在- [UIScreen snapshotViewAfterScreenUpdates:]
返回的视图上调用该方法。【参考方案2】:
如果你有 UIView,你可以执行以下操作将其转换为图像:
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
UIGraphicsBeginImageContextWithOptions(YOUR_UIVIEW.bounds.size, NO, [UIScreen mainScreen].scale);
//if it is retina display
else
UIGraphicsBeginImageContext(YOUR_UIVIEW.bounds.size);
//no retina display
[YOUR_UIVIEW.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSData *imageData = UIImagePNGRepresentation(image);
你可以使用 *image 作为图像,或者在任何你喜欢的地方转换 *imageData。
【讨论】:
我想避免这种情况,因为它是 15x slower 而不仅仅是返回图像。完美世界将是只有状态栏的 15 倍速度。【参考方案3】:为什么不对snapshotViewAfterScreenUpdates:
的结果调用drawViewHierarchyInRect:afterScreenUpdates:
?这样你就可以在 UIView 中获取状态栏(而不是它自己的 UIWindow),然后创建和修改 UIImage。
extension UIScreen
class func screenshotView() -> UIView
return mainScreen().snapshotViewAfterScreenUpdates(false)
class func screenshot() -> UIImage
let view = screenshotView()
UIGraphicsBeginImageContext(view.bounds.size)
view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true)
let screenshot = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return screenshot
【讨论】:
以上是关于使用 iOS 7 的新截屏方法,一种返回不带状态栏的 UIImage,另一种返回带有状态栏的 UIView。如何模糊状态栏?的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 7 中,如果我使用 `prefersStatusBarHidden` 方法隐藏状态栏,导航栏会缩小/失去高度。我可以停止这种行为吗?
Android截屏截图方法汇总(ActivityViewScrollViewListViewRecycleViewWebView截屏截图)