5

根据我的阅读,iOS7 的新drawViewHierarchyInRect应该比 CALayer 的renderInContext更快。根据thisthis,调用应该很简单:

[myView drawViewHierarchyInRect:myView.frame afterScreenUpdates:YES];

代替

[myView.layer renderInContext:UIGraphicsGetCurrentContext()];

但是,当我尝试这个时,我只会得到空白图像。执行捕获的完整代码,其中“self”是 UIView 的子类,

        // YES = opaque. Ignores alpha channel, so less memory is used.
        // This method for some reasons renders the
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, YES, self.window.screen.scale);    // Still slow.

    if ( [AIMAppDelegate isOniOS7OrNewer] )
        [self drawViewHierarchyInRect:self.frame afterScreenUpdates:YES]; // Doesn't work!
    else
        [self.layer renderInContext:UIGraphicsGetCurrentContext()];     // Works!

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    contentImageView.image = image; // this is empty if done using iOS7's way

并且 contentImageView 是一个 UIImageView ,它在初始化期间作为子视图添加到 self 。

此外,我想在图像中捕获的绘图包含在其他子视图中,这些子视图也在初始化期间作为子视图添加到自身(包括 contentImageView)。

任何想法为什么在使用 drawViewHierarchyInRect 时会失败?

* 更新 *

如果我绘制一个特定的子视图,我会得到一个图像,例如:

[contentImageView drawViewHierarchyInRect:contentImageView.frame afterScreenUpdates:YES];

或者

[self.curvesView drawViewHierarchyInRect:self.curvesView.frame afterScreenUpdates:YES];

但是我需要将所有可见的子视图组合成一个图像。

4

1 回答 1

6

尝试使用self.bounds而不是self.frame- 您可能会获得在您创建的图像上下文边界之外渲染的视图图像。

于 2013-11-06T20:54:20.917 回答