截取长图, 屏幕肯定是能够滑动的, 所以基类是UIScrollView, 一般是webview或tableview等控件, 我在项目中使用的是tableview, 截取时在头部拼接一个view,用来描述图片的说明!
具体实现代码:
#pragma mark ======= 截屏 ======
// 返回截取后的图片
-(UIImage *)screenshotsImage{
//拼接头视图
self.tableView.tableHeaderView = [self headView];
if (self.tableView.contentSize.height < kHeight) {
//如果tableview数据的高度小于屏幕高度, 就截整屏显示, 否则数据源只有1、2条时, 截取的内容就会很少,不美观
self.tableView.contentSize = CGSizeMake(kWidth, kHeight);
}
// 开启图形上下文
UIGraphicsBeginImageContextWithOptions(self.tableView.contentSize, YES, [UIScreen mainScreen].scale);
CGPoint savedContentOffset = self.tableView.contentOffset;
CGRect savedFrame = self.tableView.frame;
self.tableView.contentOffset = CGPointZero;
self.tableView.frame = CGRectMake(0, Height_NavBar, self.tableView.contentSize.width, self.tableView.contentSize.height);
[self.tableView.layer renderInContext: UIGraphicsGetCurrentContext()];
//因为 renderInContext 渲染时会导致内存急剧上升,可能会造成crash, 所以要清除 layer 绘制过后产生的缓存
self.tableView.layer.contents = nil; //释放缓存
UIImage *image = [[UIImage alloc]init];
image = UIGraphicsGetImageFromCurrentImageContext(); //从图形上下文获取图片
UIGraphicsEndImageContext();
self.tableView.tableHeaderView = nil;
self.tableView.contentOffset= savedContentOffset;
self.tableView.frame= savedFrame;
return image;
}
//截屏时添加头视图, 显示日期
-(UIView *)headView{
UIView *headView = [[UIView alloc] initWithFrame:CGRectMake(0, 10, 240, 45)];
headView.backgroundColor = keyColor;
UILabel *textLab = [[UILabel alloc] init];
textLab.text = self.title;
textLab.textColor = [UIColor whiteColor];
textLab.font = [UIFont systemFontOfSize:18];
[headView addSubview:textLab];
[textLab mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.mas_equalTo(headView);
}];
return headView;
}
注意: 如果截取的图片背景是黑色, 将tableview的背景色改为白色即可!
Ending...
网友评论