作者whitefur (白毛)
看板MacDev
标题Re: [问题] UITableView截图
时间Thu Jan 9 15:06:42 2014
後来试了三种写法
最後一种写法效能最好
但是也遇到一些问题, 详见方法三(附Demo 影片 & github)
方法一:
1.把tableView.frame展开成跟contentSize一样的大小,
2.再用tableView.layer renderInContext:......
但是如果tableView展开太大的话
效能会奇差无比
因为没有reuse cell
必需把所有cell都画到tableView上
方法二: (方法一的改良版)
1.把tableView.frame展开成欲截图范围的大小, 而不是contentSize的大小(改善效能的关键)
2.设contentOffset 或用 scrollToRowAtIndexPath: 把bounds移到欲截图的范围
3.一样用tableView.layer renderInContext:.... , 但是只有欲截图的范围(bounds的范围)会被画在context上, 其它部分则是空白的
4.再用CGImageCreateWithImageInRect把context上面的截图部分(非空白部分)取出
虽然效能提昇了, 但如果欲截图的范围太大, 一样会变很慢
worst case: 欲截图范围为整个tableView的contentSize
方法三: (效能最佳版)
1.针对欲截图范围的每个cell, 依序使用[tableView scrollToIndexPath:
将bounds移动到该处, 使cell可以被画在tableView上
2.再用cell.layer renderInContext
3.使用CGContextTranslateCTM移动context的origin至下次要render cell的原点
总而言之
此做法的概念为: 依序一个一个把cell render到context上
目前遇到一个问题
我的cell里有UITextView
如果截图范围超出tableView的height
截下来的图, 有部分的textView.text会重覆
只有UITextView会有这种情况, 其它如UIButton, UITextField都是正常的
请看Demo影片 (按下play键後可能要等一下)
http://screencast.com/t/jpZNcETe
Demo project
https://github.com/WhiteFur/ScreenshotTableViewDemo
重点程式码 - 截图
//indexPaths为欲截图的cells
- (UIImage*)screenShotForIndexPaths:(NSArray*)indexPaths
{
CGPoint originalOffset = self.tableView.contentOffset;
//产生欲截图范围size的context, width为tableView的width, height为欲截图的cells的total height
UIGraphicsBeginImageContextWithOptions(CGSizeMake(CGRectGetWidth(self.tableView.frame), self.tableView.rowHeight * [indexPaths count]), NO, 0.0);
CGContextRef ctx = UIGraphicsGetCurrentContext();
//---一个一个把cell render到CGContext上
MyTableViewCell *cell = nil;
for(NSIndexPath *indexPath in indexPaths)
{
//让该cell被正确的产生在tableView上, 之後才能在CGContext上正确的render出来
[self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionNone animated:NO];
cell = (MyTableViewCell*)[self.tableView cellForRowAtIndexPath:indexPath];
[cell.layer renderInContext:ctx];
//--欲在context上render的origin
CGContextTranslateCTM(ctx, 0, self.tableView.rowHeight);
//--
}
//---
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
self.tableView.contentOffset = originalOffset;
return image;
}
以上,非常感谢
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 110.29.193.144
※ 编辑: whitefur 来自: 110.29.193.144 (01/09 15:09)
※ 编辑: whitefur 来自: 110.29.193.144 (01/09 15:10)
※ 编辑: whitefur 来自: 110.29.193.144 (01/09 15:10)
※ 编辑: whitefur 来自: 110.29.193.144 (01/09 15:33)