iOS scrollview截长图 解决iOS 11 tableView截长图不全 contentSize获取不准

iOS scrollview截长图 解决iOS 11 tableView截长图不全 contentSize获取不准_第1张图片
错误展示.png

iOS scrollview截长图 解决iOS 11 tableView截长图不全 contentSize获取不准_第2张图片
正常展示.png

问题

之前APP内截取tableView长图在iOS 11以下的机型可以正常运行,但是iOS 11系统却只能截图当前屏幕范围内的图片,如下图所示

原因

IOS11以后,Self-Sizing默认开启,包括Headers, footers。如果项目中没使用estimatedRowHeight属性,在IOS11下会有奇奇怪怪的现象,因为IOS11之前,estimatedRowHeight默认为0,Self-Sizing自动打开后,contentSize和contentOffset都可能发生改变。可以通过设置tableView的estimatedRowHeight、estimatedSectionHeaderHeight、estimatedSectionFooterHeight属性为0来关闭Self-Sizing。

解决方法

在对应的tableView处设置如下属性,关闭Self-Sizing。

_tableView.estimatedRowHeight = 0; 
_tableView.estimatedSectionHeaderHeight = 0; 
_tableView.estimatedSectionFooterHeight = 0;

很多童鞋反馈目前iOS11之后还有问题,放出截图方法

- (UIImage *)captureScrollView:(UIScrollView *)scrollView{
    CGRect  savedFrame = scrollView.frame;
    CGSize size = CGSizeMake(scrollView.contentSize.width, scrollView.contentSize.height);
    if(&UIGraphicsBeginImageContextWithOptions != NULL){
        //第一个参数表示区域大小。第二个参数表示透明开关,如果图形完全不用透明,设置为YES以优化位图的存储.第三个参数就是屏幕密度了
        UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);
    }else{
        UIGraphicsBeginImageContext(size);
    }
    scrollView.contentOffset = CGPointZero;
    scrollView.frame = CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height);
    
    //iOS7 提供的截屏新方法,可以不在主线程做
    [scrollView drawViewHierarchyInRect:CGRectMake(0, 0, scrollView.frame.size.width, scrollView.frame.size.height) afterScreenUpdates:YES];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    scrollView.frame = savedFrame;
    if(image != nil){
        return image;
    }
    return nil;
}

xib出现问题的请把tableView换成手写,试了多种方法,xib截取长图展示不全

--- 2019.11.16

有帮助请点赞

你可能感兴趣的:(iOS scrollview截长图 解决iOS 11 tableView截长图不全 contentSize获取不准)