如何捕获当前视图截图并在代码中重用?(iPhone SDK)

Car*_* C. 11 iphone core-animation rotation

当用户旋转设备时,我正准备从一个UIView转换到另一个UIView.这本身并不困难.但是,由于我在旋转后显示完全不同的内容,因此UIKit提供的默认动画(旋转当前显示的视图)在概念上是不合适的.

简单地禁用动画并突然交换视图是可以忍受的,但远远低于我正在构建到应用程序其余部分的润色.我更喜欢这样做:

什么时候应该调用AutorotateToInterfaceOrientation:我想在旋转之前抓取一个不透明的视图快照,如果你愿意的话,截取用户视图.然后在完成旋转并且系统已应用视图变换等之后,我可以显示我保存的快照视图,并将我选择的过渡动画设置为我的新视图.完成后,我可以发布我的快照并继续前进.

有没有办法做到这一点并不昂贵?

我能想到的唯一另一个选择是在除默认方向之外的所有方向上返回NO,然后通过应用我自己的动画和变换做出反应.我宁愿使用系统来做这件事,因为我觉得自己可能会在手动旋转的视图中导致"未定义"的键盘行为等.

思考?

小智 21

- (UIImage *)captureView:(UIView *)view {
    CGRect screenRect = [[UIScreen mainScreen] bounds];

    UIGraphicsBeginImageContext(screenRect.size);

    CGContextRef ctx = UIGraphicsGetCurrentContext();
    [[UIColor blackColor] set];
    CGContextFillRect(ctx, screenRect);

    [view.layer renderInContext:ctx];

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return newImage;
}
Run Code Online (Sandbox Code Playgroud)

在这里找到:

http://discussions.apple.com/thread.jspa?messageID=8358740


Moh*_* Km 12

这段代码对我有用

- (UIImage *)captureScreenInRect:(CGRect)captureFrame {
    CALayer *layer;
    layer = self.view.layer;
    UIGraphicsBeginImageContext(self.view.bounds.size); 
    CGContextClipToRect (UIGraphicsGetCurrentContext(),captureFrame);
    [layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *screenImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return screenImage;
}
Run Code Online (Sandbox Code Playgroud)


And*_*iot 1

我可以保证你 [window drawRect:] 不会工作。大多数视图不实现drawRect:并且它肯定不像Mac上那样是递归的。

drawInContext: 也几乎是类似的,因为它从根本上要求图层绘制自身,而不是递归地绘制其子图层。“默认实现什么也不做。” 说明了一切。

我通过执行以下操作为应用程序商店中的 Clif Bar Save Our Snow 应用程序实现此功能:

  • 递归地遍历层层次结构,从每个层获取内容。如果它闻起来像图像,请使用 CGContext 方法将其绘制到您的上下文中。
  • 行走时,请确保在递归调用时应用每层的变换/位置

是的,一个相当大的痛苦。但是,是的,它运行得很好,并且被苹果公司通过了:)。