如何从后台的任何东西创建UIImage

时间:2013-10-21 15:05:28

标签: ios uiimageview ios7

我使用2013年WWDC的其中一个应用程序中提供的UIImage + ImageEffects.h示例代码将模糊应用于我的应用的各个部分。它运行良好,我可以重新创建iOS7效果任何UIImage。

但是,我想重新创建UINavigationBar模糊透明度的效果,但使用我选择的任何视图。与下面显示的屏幕截图类似。

例如,假设我有一个占据屏幕一半的UITableView。我还有一个UIImageView背景作为它背后的独立视图占据了整个屏幕。我只想模糊UIImageView背景,只是在tableview下的屏幕部分。

这是我的问题。如何通过显示UIView背后的任何内容的“屏幕截图”来创建创建UIImage?这甚至可能吗?

谢谢!

screenshot

这是我的屏幕层次结构。没什么复杂的。我希望“模糊图像视图”包含“图像视图”部分的模糊图像,该图像作为层次结构中的主要UIImageView。

enter image description here

2 个答案:

答案 0 :(得分:2)

如果你只在iOS7上进行deploing,你可以使用比-renderInContext快很多的新api,并使用从视图中获取的图像上的ImageEffects类别。在UIView

上添加一个类别
@interface UIView (RenderView)

- (UIImage *) imageByRenderingView;
- (UIImage *) imageByRenderingViewOpaque:(BOOL) yesOrNO;


@end

@implementation UIView (RenderView)

- (UIImage *) imageByRenderingViewOpaque:(BOOL) yesOrNO {
        UIGraphicsBeginImageContextWithOptions(self.bounds.size, yesOrNO, 0);

    if ([self respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)]) {
        [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:NO];
    }
    else {
        [self.layer renderInContext:UIGraphicsGetCurrentContext()];
    }
    UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return resultingImage;
}
- (UIImage *) imageByRenderingView{
    return [self imageByRenderingViewOpaque:NO];
}

此片段对于低于iOS7的系统也是一个UIView类别。它会在视图及其子视图上显示图像。

答案 1 :(得分:0)

使用下面的iOS代码< 7

#import <QuartzCore/QuartzCore.h>

+ (UIImage *) imageWithView:(UIView *)view
{
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return img;
}