2

我正在尝试将 a 绘制UIView成 a 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 设备上测试过这个案例,都一样。该图层没有任何子图层,我尝试设置masksToBoundsNO未更改任何内容。

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

4

2 回答 2

3

你需要改变:

[myView.layer drawInContext:UIGraphicsGetCurrentContext()];

至:

[myView.layer renderInContext:UIGraphicsGetCurrentContext()];

请注意,drawInContext:默认情况下实际上不做任何事情:

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

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

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

于 2014-03-09T19:52:26.430 回答
1

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

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

于 2014-03-09T19:23:41.623 回答