我正在尝试将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
,但没有改变任何内容。
什么可能导致视图层不绘制?
答案 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
类别