【问题标题】:How to take an iPhone screenshot of entire view including parts off screen?如何截取整个视图的 iPhone 屏幕截图,包括屏幕外的部分?
【发布时间】:2011-01-20 15:43:53
【问题描述】:

我有一个使用 UITableView 布局的应用程序。界面占用的不仅仅是屏幕,所以有一些区域可以滚动到。我想要整个视图(包括不可见区域)的一些屏幕截图,用于记录和征求客户的反馈。

是否有编程方式来获取整个视图的图像?我认为设备上没有办法做到这一点,但也许有。

【问题讨论】:

    标签: iphone objective-c cocoa-touch uitableview


    【解决方案1】:

    使用 iphone 上的表格视图,没有“额外”区域可以滚动到。表格视图与屏幕一样大,当新单元格滚动到视图中时,它们是按需创建的,而滚动到屏幕外的旧单元格则被释放。

    【讨论】:

    • 适当指出,但这并不能真正解决我获取整个界面截图的问题(没有多张照片,然后将它们拼接在一起)。
    • 他是说你确实得到了整个界面的截图。屏幕外的表格部分是合乎逻辑的。它们根本没有视觉表现。表格不像滚动视图,它只是向您显示较大视图的一部分。有了一张桌子,所见即所得。每次滚动表格时,它都会自行重建。在您滚动到屏幕外的某个位置之前,该位置在视觉上是不存在的。
    • @TechZen 是的,我知道它是即时构建的,我想要的是整个界面的屏幕截图,就好像所有逻辑单元格都被绘制了一样(尽可能多的空间)。
    • @Bearddo 所以,澄清一下,你想要的是一张真正拉长的 iPhone 的照片?
    • 实际上,是的。就像说您想要联系人应用程序中所有联系人的照片,而不仅仅是可见的。因为我有我的应用程序的源代码,所以我应该能够做到这一点。也许只是构建一个 UITableView 并对其大小撒谎,然后用不同的图形上下文渲染它?
    【解决方案2】:

    As Jasarien said,UITableView 没有离屏元素。这只是一个舞台幻觉,创造了单个长元素的外观。

    如果你想创建一个长(即离屏)表格的图像,你 should take screenshots of the table 在不同的滚动位置,然后 Photoshop/GIMP/insert-graphics-app 将屏幕截图应用到一个长图形中。

    【讨论】:

      【解决方案3】:

      只是粘贴一些我在我的应用程序中使用的代码。它绘制图像的视图(可能缩放)。 也许您可以以编程方式滚动表格并将图像最后拼接在一起或类似的东西:

      + (UIImage *)captureView: (UIView *)view inSize: (CGSize)size
      {
          UIGraphicsBeginImageContext(size);
          CGSize viewSize = view.frame.size;
          CGContextRef context = UIGraphicsGetCurrentContext();
          CGContextScaleCTM( context, size.width/viewSize.width, size.height/viewSize.height);
      
          [view.layer renderInContext: UIGraphicsGetCurrentContext()];
      
          UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
          UIGraphicsEndImageContext();
          return viewImage;
      }
      

      希望对你有帮助

      【讨论】:

      • 是的,如果不是使其缩放,而是简单地使用视图的大小,并且在创建 UITableView 时,将其设置为足够高以容纳视图和标准中的所有逻辑单元格,它就像一个冠军宽度。
      【解决方案4】:

      您实际上可以滚动表格视图。以下代码在我的应用程序中完美运行。 但是制作屏幕截图可能需要白色。你可以参考this看看有没有人改进。

      //viewController is your UITableViewController
      UIGraphicsBeginImageContext(viewController.tableView.contentSize);
      [viewController.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];
      [viewController.tableView.layer renderInContext:UIGraphicsGetCurrentContext()];
      
      int rows = [viewController.tableView numberOfRowsInSection:0];
      int numberofRowsInView = 7;
      for (int i =0; i < rows/numberofRowsInView; i++) {
          [viewController.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:(i+1)*numberofRowsInView inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];
          [viewController.tableView.layer renderInContext:UIGraphicsGetCurrentContext()];
      
      }
      UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
      UIGraphicsEndImageContext();
      

      【讨论】:

        【解决方案5】:

        截取整个表格视图,而不仅仅是可见单元格。这种方法不需要滚动表格视图并截取许多屏幕截图并将它们放在一起。

        适用于表格视图的页脚和页眉。

        CGRect frame = _tableView.frame;
        frame.size.height = _tableView.contentSize.height;//the most important line
        _tableView.frame = frame;
        
        UIGraphicsBeginImageContext(_tableView.bounds.size);
        [_tableView.layer renderInContext:UIGraphicsGetCurrentContext()];
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        
        NSData * data = UIImagePNGRepresentation(image);
        

        【讨论】:

        • 完美的方法。这会在截屏之前更改 tableView 框架的高度,因此您不必为滚动而烦恼。请注意,如果您有一个可见的导航栏,则必须调整框架的高度。
        • 一次修改:在 UIGraphicsEndImageContext(); 之后,你应该将 tableView 框架恢复到原来的样子,否则滚动会混乱。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-16
        • 2021-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多