将 UITableView 捕获为图像 - 滚动

Capture UITableView as Image - With Scrolling

当 table 向下滚动时,我的 Swift 用于将 UITableView 捕获为图像的代码无法正常工作。我基本上在 Objective-C 中找到了答案,但似乎无法在 Swift 中使用。目前这是我在 Swift:

中的内容
func snapshotOfCell (inputView: UIView) -> UIView {
    UIGraphicsBeginImageContextWithOptions(inputView.bounds.size, false, 0.0)
    inputView.layer.renderInContext(UIGraphicsGetCurrentContext()!)
    let image = UIGraphicsGetImageFromCurrentImageContext() as UIImage
    UIGraphicsEndImageContext()
    let cellSnapshot : UIView = UIImageView(image: image)
    cellSnapshot.layer.masksToBounds = false

    return cellSnapshot
}

我找到了 this 答案,但它在 Objective-C:

-(UIImage *) imageWithTableView:(UITableView *)tableView {
    UIView *renderedView = tableView;
    CGPoint tableContentOffset = tableView.contentOffset;
    UIGraphicsBeginImageContextWithOptions(renderedView.bounds.size, renderedView.opaque, 0.0);
    CGContextRef contextRef = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(contextRef, 0, -tableContentOffset.y);
    [tableView.layer renderInContext:contextRef];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

似乎通过使用 contentOffset 解决了滚动问题。但是,我一直试图将它集成到我的 Swift 函数中,但没有成功。有人擅长 Objective-C 和 Swift 吗?谢谢!

试试这段代码:

-(UIImage *)screenshot {
UIImage *image = nil;

UIGraphicsBeginImageContextWithOptions(tableView.contentSize, false, 0.0);
{
    CGPoint savedContentOffset = tableView.contentOffset;
    CGRect savedFrame = tableView.frame;

    tableView.contentOffset = CGPointMake(0.0, 0.0);
    tableView.frame = CGRectMake(0, 0.0, tableView.contentSize.width, tableView.contentSize.height);

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

    tableView.contentOffset = savedContentOffset;
    tableView.frame = savedFrame;
}
UIGraphicsEndImageContext();

return image;
}

快乐编码..!!

请试试这个可能对你有帮助

- (UIImage*)buildImage:(UIImage*)image
{
   UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale);

   [image drawAtPoint:CGPointZero];


   CGFloat scale;

   scale = image.size.width / _workingView.frame.size.width;



       CGContextScaleCTM(UIGraphicsGetCurrentContext(), scale, scale);

   NSLog(@"%f",scale);


   [tableView.layer renderInContext:UIGraphicsGetCurrentContext()];

   UIImage *tmp = UIGraphicsGetImageFromCurrentImageContext();

   UIGraphicsEndImageContext();

   return tmp;
}

将整个表格视图捕获为图像

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(tableView.contentSize.width, tableView.contentSize.height),false, 0.0)

    let context = UIGraphicsGetCurrentContext()

    let previousFrame = tableView.frame

    tableView.frame = CGRectMake(tableView.frame.origin.x, tableView.frame.origin.y, tableView.contentSize.width, tableView.contentSize.height);

    tableView.layer.renderInContext(context!)

    tableView.frame = previousFrame

    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext();

    imageView.image = image;

在滚动位置捕获tableview的屏幕截图

    let contentOffset = tableView.contentOffset

    UIGraphicsBeginImageContextWithOptions(tableView.bounds.size, true, 1)

    let context = UIGraphicsGetCurrentContext()

    CGContextTranslateCTM(context, 0, -contentOffset.y)

    tableView.layer.renderInContext(context!)

    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    imageView.image = image;

Swift 基于@Jeyamahesan 的回答捕获整个表格视图的 3.0 版本

UIGraphicsBeginImageContextWithOptions(CGSize(width:tableView.contentSize.width, height:tableView.contentSize.height),false, 0.0)
let context = UIGraphicsGetCurrentContext()
let previousFrame = tableView.frame
tableView.frame = CGRect(x: tableView.frame.origin.x, y: tableView.frame.origin.y, width: tableView.contentSize.width, height: tableView.contentSize.height)
tableView.layer.render(in: context!)
tableView.frame = previousFrame
let image = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()