使用 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` 方法隐藏状态栏,导航栏会缩小/失去高度。我可以停止这种行为吗?

如何在 iOS 7 中隐藏状态栏?

截屏状态监听 - iOS

让导航栏与iOS 7中的状态栏重叠

Android截屏截图方法汇总(ActivityViewScrollViewListViewRecycleViewWebView截屏截图)

在 iOS 7 中让导航栏与状态栏重叠