IOS实现长图截取

总结一下最近遇到的功能开发。

因为IOS自带的截图并不能截取长图,所以为了更好的用户体验,我们需要开发对应的功能。

- (UIImage *)screenShotWithSize:(CGSize )size {
    UIImage* image = nil;
    /*
     *UIGraphicsBeginImageContextWithOptions有三个参数
     *size    bitmap上下文的大小,就是生成图片的size
     *opaque  是否不透明,当指定为YES的时候图片的质量会比较好
     *scale   缩放比例,指定为0.0表示使用手机主屏幕的缩放比例
     */
    UIGraphicsBeginImageContextWithOptions(size, YES, [UIScreen mainScreen].scale);
    //保存tableView当前的偏移量
    CGPoint savedContentOffset = self.tableView.contentOffset;
    CGRect saveFrame = self.tableView.frame;
    CGRect saveViewFrame = self.view.frame;
    
    //将tableView的偏移量设置为(0,0)
    self.tableView.contentOffset = CGPointZero;
    self.tableView.frame = CGRectMake(0, saveFrame.origin.y, self.tableView.contentSize.width, self.tableView.contentSize.height);
    self.view.frame = CGRectMake(0, 0, size.width,size.height);
    //在当前上下文中渲染出tableView
    [self.view.layer renderInContext: UIGraphicsGetCurrentContext()];
    //截取当前上下文生成Image
    image = UIGraphicsGetImageFromCurrentImageContext();
    
    UIGraphicsEndImageContext();
    
    //恢复tableView的偏移量
    self.tableView.frame = saveFrame;
    [self.tableView setContentOffset:savedContentOffset animated:NO];
    self.view.frame = saveViewFrame;
    
    
    if (image != nil) {
        return image;
    }else {
        return nil;
    }
}

以view作为容器,在截图前后通过变换view和tableView的高度,实现长截图功能。同理,也可以根据该方法,实现collectionView和scrollView的全截图。至于后续是保存本地还是分享到三方平台,这个就需要各位看官自己去实现了。

PS:这个方法有些时候会造成截图不完整,经过调查发现,是因为没有关闭self-sizing,这个时候就需要下方的代码了。

//关闭self-sizing
_tableView.estimatedRowHeight = 0;
_tableView.estimatedSectionHeaderHeight = 0;
_tableView.estimatedSectionFooterHeight = 0;

 

你可能感兴趣的:(iOS开发小技巧,源码互动)