如何捕获UITableView/UIScrollView的完整内容的UIImage并使其在ios设备上运行

Ben*_*ebe 3 iphone screenshot uiscrollview graphicscontext ios

我正在使用这段非常优雅的代码 获取UIScrollView的屏幕截图,包括屏幕外部分,以捕获要导出到UIImage的UITableView的全部内容.

UIGraphicsBeginImageContextWithOptions(self.controller.tableView.contentSize, YES, 0);
{
    CGPoint savedContentOffset = self.controller.tableView.contentOffset;
    CGRect savedFrame = self.controller.tableView.frame;

    self.controller.tableView.contentOffset = CGPointZero;
    self.controller.tableView.frame = CGRectMake(0, 0, self.controller.tableView.contentSize.width, self.controller.tableView.contentSize.height);

    [self.controller.tableView.layer renderInContext: UIGraphicsGetCurrentContext()];
    image = UIGraphicsGetImageFromCurrentImageContext();

    self.controller.tableView.contentOffset = savedContentOffset;
    self.controller.tableView.frame = savedFrame;
}

UIGraphicsEndImageContext();
Run Code Online (Sandbox Code Playgroud)

它在模拟器中运行得非常好,但是,当我在iOS设备(iphone 4s)上运行此代码时,在调用此方法时,我会得到以下错误的全部飞跃:

[self.controller.tableView.layer renderInContext: UIGraphicsGetCurrentContext()];
Run Code Online (Sandbox Code Playgroud)

错误:

Error: CGContextTranslateCTM: invalid context 0x2924b0
Error: CGContextDrawImage: invalid context 0x2924b0
Error: CGContextRestoreGState: invalid context 0x2924b0
Error: CGContextSaveGState: invalid context 0x2924b0
Error: CGContextScaleCTM: invalid context 0x2924b0
Error: CGContextClipToRect: invalid context 0x2924b0
etc...
Run Code Online (Sandbox Code Playgroud)

当表视图内容大小在其范围内时,此代码很有效,但只要它大于其边界(即使是1个像素),它就会进入上述错误的无限循环.但这只发生在设备上.不是模拟器.

有任何想法吗?

Ben*_*ebe 8

事实证明,使用[UIImage ..] resizableImageWithCapInsets]方法并将其应用于单元backgroundView并调整框架会导致各种时髦的不良情况发生在实际设备上而不是模拟器上.

恢复到已弃用的[UIImage ..] stretchableImageWithLeftCapWidth:topCapHeight:]方法解决了它.