1

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

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

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

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

截屏

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

在此处输入图像描述

4

2 回答 2

2

如果您仅在 iOS7 上进行部署,则可以使用新的 api,这比-renderInContext在从视图中获取的图像上使用 ImageEffects 类别要快得多。添加此 aa 类别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];
}

这个片段是一个 UIView 类别,也适用于低于 iOS7 的系统。它在视图及其子视图上拍摄图像。

于 2013-10-21T15:20:36.140 回答
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;
}
于 2013-10-21T16:12:57.307 回答