【问题标题】:Capture UIView without using renderInContext:不使用 renderInContext 捕获 UIView:
【发布时间】:2014-04-21 12:52:09
【问题描述】:

我想从我的屏幕创建视频,为此我将捕获视图,但由于某种原因我不想使用renderInContext:。我现在正在使用drawViewHierarchyInRect:,但这仅限于 iOS 7,而且我的应用程序也支持早期的 iO​​S 版本。使用drawViewHierarchyInRect:会被罚款吗?

这是我的代码

UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 0);
[self drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

【问题讨论】:

  • 它调用 drawInRect: 方法,我在其他类中用于平铺图像。这让我的应用程序效率低下。

标签: ios objective-c uiview


【解决方案1】:

我了解您不想使用renderInContext,因为它的效率较低,但对于 7 之前的 iOS 版本,这是您应该使用的技术(因为如果您尝试在之前的 iOS 版本中使用 drawViewHierarchyInRect到 7.0,应用程序将崩溃)。因此,这是一个在可用时使用drawViewHierarchyInRect,但在不可用时使用renderInContext 的再现:

UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 0.0);

if ([self respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)]) {
    BOOL success = [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES];
    NSAssert(success, @"drawViewHierarchyInRect failed");
} else {
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];
}

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

这样,您将在 iOS 7+ 上使用更高效的机制,但至少在早期版本上运行时不会崩溃。

【讨论】:

  • 它可以工作,但不幸的是在 CFDataGetBytes(image, CRangeMake(0, CFDataGetLength(image)), destPixels); 中创建了中断,我用它来将图像写入视频
  • 这听起来像是一个非常不同的问题。当我想从UIImage 获取像素数据时,我会为UIImage 获取CGImage,然后使用Apple 在QA1509 中讨论的技术。有关示例,请参见 stackoverflow.com/a/22897776/1271826
猜你喜欢
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多