在iOS上截取当前不在屏幕上的视图的屏幕截图

4

我正在尝试在两个视图控制器之间进行转换。我的Transition类有一个目标视图控制器属性。当我尝试获取目标视图的屏幕截图时,我使用以下方法:

+ (UIImage *)renderImageFromView:(UIView *)view withRect:(CGRect)frame {
    // Create a new context the size of the frame
    UIGraphicsBeginImageContextWithOptions(frame.size, YES, 0);
    CGContextRef context = UIGraphicsGetCurrentContext();

    // Render the view 
    [view.layer renderInContext:context];

    // Get the image from the context
    UIImage *renderedImage = UIGraphicsGetImageFromCurrentImageContext();

    // Cleanup the context you created
    UIGraphicsEndImageContext();

    return renderedImage;
}

所以当我需要这张图片时,我会这样做:

UIImage *image = [UIImage renderImageFromView:destinationController.view withRect:destinationController.view.bounds];

我在一个空的UIViewController上尝试了一下,这个UIViewController有一个橙色的背景和一个标签。 我得到了橙色的背景颜色,但是我没有得到在IB中创建的标签。有没有办法获取我计划显示的新视图的正确截屏?谢谢!


你的方法要求传递一个视图和一个框架,但你只传递了一个视图。你是在展示两个不同的函数吗? - Kris Gellci
@Kris Gellci 您是正确的,我复制并粘贴了错误的用法。我会修复它。 - Crystal
我看到你遇到了同样的问题 - 当我在回答你关于iBooks动画的另一个问题时,我也尝试了你现在正在尝试的事情。 - rdelmar
我遇到了完全相同的问题。你找到了可行的解决方案吗? - Sheharyar
1个回答

1

您需要确保视图的层首先被绘制。在CALayer上调用renderInContext仅会递归调用其他子CALayer。您需要让子UIView自己绘制,而不仅仅使用CALayer

尝试调用

[view drawrect:frame]; 

而不是

[view.layer renderInContext:context];

只要您有一个开放的图形上下文(在那一点上您确实有),drawrect 就应该直接绘制到其中。

在这种情况下调用drawRect可以吗?我只记得读到过使用setNeedsDisplay而不是直接调用drawRect的建议。谢谢! - Crystal
你是正确的,通常情况下你不想直接调用它,因为系统会根据需要调用它,并且可以优化它所做的调用次数。在这种情况下,你处于图形上下文中并需要绘制,所以我认为这是可以的,只要你不要多次调用它(希望只调用一次),并确保在主线程上执行。在任何其他情况下,通常只需让系统进行绘制而无需管理任何上下文。如果你执行了setNeedsDisplay,则绘制将不会发生在你刚创建的图形上下文中。 - Kekoa
你知道为什么我使用 [view drawRect:frame] 会得到一个空白屏幕吗?我似乎没有看到任何绘制到上下文中的东西。 - Crystal
我能想到的唯一可能是框架不正确或视图为空。 - Kekoa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接