view.layer drawInContext:UIGraphicsGetCurrentContext()不是绘图

时间:2014-03-09 19:17:37

标签: ios cocoa-touch cgimage cgimageref uigraphicscontext

我正在尝试将UIView绘制成UIImage。这是我正在使用的代码:

UIGraphicsBeginImageContextWithOptions(myView.bounds.size, YES, 0.f);
[myView.layer drawInContext:UIGraphicsGetCurrentContext()];
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

我已验证myView.bounds.size有效。 myView在屏幕上正确显示。但是,img完全是黑色的(我已尝试在UIImageView中显示两者并尝试将JPEG表示写入文件。)图像尺寸正确,颜色空间(在JPEG文件输出中)是RGB,颜色配置文件是sRGB等,这意味着我们没有处理损坏的图像(在图像/位图数据本身有效的意义上)。我已经在6.0模拟器,7.0模拟器和7.0.6设备上测试了这个案例,都是一样的。该图层没有任何子图层,我尝试将masksToBounds设置为NO,但没有改变任何内容。

什么可能导致视图层不绘制?

2 个答案:

答案 0 :(得分:3)

您需要更改:

[myView.layer drawInContext:UIGraphicsGetCurrentContext()];

为:

[myView.layer renderInContext:UIGraphicsGetCurrentContext()];

请注意,默认情况下drawInContext:实际上并没有执行任何操作:

  

此方法的默认实现不执行任何绘制   本身。如果图层的委托实现了drawLayer:inContext:   方法,调用该方法进行实际绘图。

     

子类可以覆盖此方法并使用它来绘制图层   内容。绘图时,应以磅为单位指定所有坐标   在逻辑坐标空间。

UIView的图层委托设置为UIView,但它看起来不像UIView必须绘制到提供的上下文。在这一点上需要进行更多的调查。

答案 1 :(得分:1)

更新:根据Rob Jones的评论,这些API不会返回UIViews,而不是图片。

iOS 7中有一个看起来很有希望的新API:

- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates NS_AVAILABLE_IOS(7_0);
- (UIView *)resizableSnapshotViewFromRect:(CGRect)rect afterScreenUpdates:(BOOL)afterUpdates withCapInsets:(UIEdgeInsets)capInsets NS_AVAILABLE_IOS(7_0);  // Resizable snapshots will default to stretching the center
- (BOOL)drawViewHierarchyInRect:(CGRect)rect afterScreenUpdates:(BOOL)afterUpdates NS_AVAILABLE_IOS(7_0);

检查UIView (UISnapshotting)

中的UIView.h类别