『ios』view和tableview的截屏和图片拼接
2018-09-25 本文已影响29人
butterflyer
image.png
image.png
项目中有这么个需求,截取当前屏幕并拼接上公司的二维码。说下解决思路。
首先上面的图片肯定不符合我的需求
-(UIImage *)screenShotFromView:(UIView *)view{
UIGraphicsBeginImageContextWithOptions(view.frame.size,NO, 0);
[[UIColor clearColor] setFill];
[[UIBezierPath bezierPathWithRect:view.bounds] fill];
CGContextRef ctx = UIGraphicsGetCurrentContext();
[view.layer renderInContext:ctx];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;}
这是方法。有句话叫做需求驱动开发。请往下看。
我现在的需求是截取整个tableview,所以我现在需要当前画布的大小要是tableview的contentsize。也就是说tableview.frame就是当前tableview的contentsize.
所以看下面的方法就明白什么意思了。
UIImage* image = nil;
[self.tableView reloadData];
[self.tableView layoutIfNeeded];
UIGraphicsBeginImageContextWithOptions(self.tableView.contentSize, YES, 0.0);
//保存collectionView当前的偏移量
CGPoint savedContentOffset = self.tableView.contentOffset;
CGRect saveFrame = self.tableView.frame;
//将collectionView的偏移量设置为(0,0)
self.tableView.contentOffset = CGPointZero;
self.tableView.frame = CGRectMake(0, 0, self.tableView.contentSize.width, self.tableView.contentSize.height);
[self.tableView reloadData];
[self.tableView layoutIfNeeded];
self.tableView.frame = CGRectMake(0, 0, self.tableView.contentSize.width, self.tableView.contentSize.height);
// LDLog(@"%@----",NSStringFromCGRect(self.tableView.frame));
//在当前上下文中渲染出collectionView
[self.tableView.layer renderInContext:UIGraphicsGetCurrentContext()];
//截取当前上下文生成Image
image = UIGraphicsGetImageFromCurrentImageContext();
//恢复collectionView的偏移量
self.tableView.contentOffset = savedContentOffset;
self.tableView.frame = saveFrame;
UIGraphicsEndImageContext();
if (image != nil) {
return image;
}else {
return nil;
}
至于图片的拼接。
- (UIImage *)addHead:(UIImage *)headImage foot:(UIImage *)footImage toMaster:(UIImage *)masterImage {
CGSize size;
size.width = masterImage.size.width;
CGFloat headHeight = !headImage? 0:headImage.size.height;
CGFloat footHeight = !footImage? 0:footImage.size.height;
size.height = masterImage.size.height + headHeight + footHeight;
UIGraphicsBeginImageContextWithOptions(size, YES, 0.0);
if (headImage)
[headImage drawInRect:CGRectMake(0, 0, masterImage.size.width, headHeight)];
[masterImage drawInRect:CGRectMake(0, headHeight, masterImage.size.width, masterImage.size.height)];
if (footImage)
[footImage drawInRect:CGRectMake(0, masterImage.size.height + headHeight, masterImage.size.width, footHeight)];
UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return resultImage;
}
这样就完美解决问题。效果图如下
image.png