使用iOS 7的新屏幕截图方法,一个返回没有状态栏的UIImage,一个返回UIView。如何模糊状态栏?

时间:2013-12-09 00:49:24

标签: ios objective-c uiview ios7 uiimage

我想模糊整个屏幕包括状态栏,然后在它上面呈现UIImageView,但事实证明这很困难。

iOS 7的截图方法drawViewHierarchyInRect:afterScreenUpdates:返回一个非常容易模糊和呈现的UIImage,但不包括状态栏(至少默认情况下),所以它不能像我想的那样工作至。另一个snapshotViewAfterScreenUpdates:,返回一个带有状态栏的UIView (耶!)但不幸的是因为它是一个UIView我不知道如何模糊它。

我可以快速将UIView转换为UIImage以模糊吗?第一种方法可以以某种方式包含状态栏吗?我可以有效地模糊UIView吗?

我只是试图模糊整个屏幕(包括状态栏)以在其上显示图像。如果我忽略了其他方式,请随意提及。

3 个答案:

答案 0 :(得分:0)

您是否尝试在应用窗口中调用drawViewHierarchyInRect:afterScreenUpdates:?窗口/应该/包含状态栏。从那里你获得图像,然后应用你想要的任何效果。

答案 1 :(得分:-1)

如果您有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);

您可以在图像中使用*图像,或者在任何地方转换* imageData。

答案 2 :(得分:-1)

为什么不对drawViewHierarchyInRect:afterScreenUpdates:的结果致电snapshotViewAfterScreenUpdates:?这样你就可以获得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
    }

}