【问题标题】:Capture UITableView as Image - With Scrolling将 UITableView 捕获为图像 - 使用滚动
【发布时间】:2016-05-05 11:45:28
【问题描述】:

当表格向下滚动时,我用于将 UITableView 捕获为图像的 Swift 代码不起作用。我基本上在 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 都很好吗?谢谢!

【问题讨论】:

    标签: ios objective-c swift uitableview uigraphicscontext


    【解决方案1】:

    将整个 tableview 捕获为图像

        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 代码一样执行。当表格没有被滚动时,它工作得很好,但它不能正确捕获滚动的表格。
    • 你想要滚动到某个位置后的 tabview 屏幕截图吗?
    • 是的,如果我没有说清楚,对不起。当我向下滚动一半然后运行代码时,图片当前似乎捕获了很多空白并且不正确。我希望图片能反映屏幕上的内容
    • 效果很好。非常感谢。
    【解决方案2】:

    根据@Jeyamahesan 的回答捕获整个tableview 的Swift 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()
    

    【讨论】:

      【解决方案3】:

      试试这段代码:

      -(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;
      }
      

      编码愉快..!!

      【讨论】:

      • 谢谢,现在出门,但今晚会试一试。这不是 Objective-C 中的前两行吗?
      • 试一试.. 它已成功测试滚动视图,我希望它也适用于您。整个代码是用 Objective-C 编写的。
      【解决方案4】:

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

      - (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;
      }
      

      【讨论】:

        猜你喜欢
        • 2016-07-07
        • 1970-01-01
        • 2013-04-26
        • 1970-01-01
        • 2016-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多