使用[layer renderInContext:]尝试将包含视图转换为UIImage时,使用resizableimagewithcapinsets的UIImage会失真

时间:2013-10-19 22:29:02

标签: iphone ios objective-c uiimageview uiimage

我有这种层次结构的视图:

-UIView    -UIImageView    -UILabel

UIImageView包含一个UIImage,其中包含使用resizableimagewithcapinsets创建的可调整大小/可伸缩图像。

当我拍摄截图时,一切都很好看:

http://i.stack.imgur.com/uA6Lg.png

但是当我尝试将视图捕获到UIImage时,结果是这样的:

http://i.stack.imgur.com/IzUyS.jpg

正如您所看到的,拉伸图像的底部看起来很有趣。

这是我用来捕获UIImage视图的代码:

- (UIImage *) imageWithView:(UIView *)view
{
    [view setBackgroundColor:[UIColor whiteColor]];
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 2.0);
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    [view setBackgroundColor:[UIColor clearColor]];
    return img;
}

注意:该应用仅用于@ 2x设备。

3 个答案:

答案 0 :(得分:0)

在尝试捕获视图图层时似乎resizableImageWithCapInsets:有问题。

还原到已弃用的stretchableImageWIthLeftCapWidth:topCapHeight:方法解决了它。但是回到被弃用的方法感觉不对,如果有人能解决这个问题,我会很高兴。

答案 1 :(得分:0)

使用drawViewHierarchyInRect替换renderInContext。 有关更多信息,请参阅How to render view into image faster?

答案 2 :(得分:0)

我刚刚遇到了一个类似的问题(虽然现在是用 Swift 编写的)并且在寻找解决方案时遇到了这个问题。

我发现我的解决方案是确保我使用的图像的中心“可拉伸”部分仅为 1x1 像素。

我认为当要渲染的区域小于使用的原始可调整大小的图像时会出现问题。