iOS-WKWebView UIScrollView 全屏截图,网页全屏截图 UiTableView UIScrollView 全屏截图

iOS-WKWebView UIScrollView 全屏截图,网页全屏截图
UiTableView  UIScrollView 全屏截图

文章来自于 :https://www.jishudog.com/5698/html

借鉴:https://www.jianshu.com/p/22b0f792ad18

UITableView+SnapImage.h

- (void)ZFJContentCaptureCompletionHandler:(void(^)(UIImage *capturedImage))completionHandler;

- (void)ZFJContentCaptureWithoutOffsetCompletionHandler:(void(^)(UIImage *capturedImage))completionHandler;

UITableView+SnapImage.m

- (void)ZFJContentCaptureCompletionHandler:(void(^)(UIImage *capturedImage))completionHandler{

    CGPoint offset = self.contentOffset;


    UIView *snapShotView = [self snapshotViewAfterScreenUpdates:YES];

    snapShotView.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, snapShotView.frame.size.width, snapShotView.frame.size.height);

    [self.superview addSubview:snapShotView];


    if(self.frame.size.height < self.contentSize.height){

        self.contentOffset = CGPointMake(0, self.contentSize.height - self.frame.size.height);

    }


    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

        self.contentOffset = CGPointZero;


        [self ZFJContentCaptureWithoutOffsetCompletionHandler:^(UIImage *capturedImage) {

            self.contentOffset = offset;


            [snapShotView removeFromSuperview];


            completionHandler(capturedImage);

        }];

    });


}

- (void)ZFJContentCaptureWithoutOffsetCompletionHandler:(void(^)(UIImage *capturedImage))completionHandler{

    UIView *containerView = [[UIView alloc]initWithFrame:self.bounds];


    CGRect bakFrame = self.frame;

    UIView *bakSuperView = self.superview;

    NSInteger bakIndex = [self.superview.subviews indexOfObject:self];


    [self removeFromSuperview];

    [containerView addSubview:self];


    CGSize totalSize = self.contentSize;


    float page = floorf(totalSize.height/containerView.bounds.size.height);


    self.frame = CGRectMake(0, 0, containerView.bounds.size.width, self.contentSize.height);

    UIGraphicsBeginImageContextWithOptions(totalSize, false, [UIScreen mainScreen].scale);

    [self ZFJContentPageDrawTargetView:containerView index:0 maxIndex:(int)page drawCallback:^{

        UIImage *capturedImage = UIGraphicsGetImageFromCurrentImageContext();

        UIGraphicsEndImageContext();


        [self removeFromSuperview];

        [bakSuperView insertSubview:self atIndex:bakIndex];


        self.frame = bakFrame;


        [containerView removeFromSuperview];


        completionHandler(capturedImage);

    }];


}

- (void)ZFJContentPageDrawTargetView:(UIView *)targetView index:(int)index maxIndex:(int)maxIndex drawCallback:(void(^)(void))drawCallback{

    CGRect splitFrame = CGRectMake(0, (float)index * targetView.frame.size.height, targetView.bounds.size.width, targetView.frame.size.height);


    CGRect myFrame = self.frame;

    myFrame.origin.y = - ((float)index * targetView.frame.size.height);

    self.frame = myFrame;


    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

        [targetView drawViewHierarchyInRect:splitFrame afterScreenUpdates:YES];


        if(index<maxIndex){

            [self ZFJContentPageDrawTargetView:targetView index:index + 1 maxIndex:maxIndex drawCallback:drawCallback];

        }else{

            drawCallback();

        }

    });

}

WKWebView+SnapImage.m

- (void)ZFJContentCaptureCompletionHandler:(void(^)(UIImage *capturedImage))completionHandler{

    CGPoint offset = self.scrollView.contentOffset;


    UIView *snapShotView = [self snapshotViewAfterScreenUpdates:YES];

    snapShotView.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, snapShotView.frame.size.width, snapShotView.frame.size.height);

    [self.superview addSubview:snapShotView];


    if(self.frame.size.height < self.scrollView.contentSize.height){

        self.scrollView.contentOffset = CGPointMake(0, self.scrollView.contentSize.height - self.frame.size.height);

    }


    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

        self.scrollView.contentOffset = CGPointZero;


        [self ZFJContentCaptureWithoutOffsetCompletionHandler:^(UIImage *capturedImage) {

            self.scrollView.contentOffset = offset;


            [snapShotView removeFromSuperview];


            completionHandler(capturedImage);

        }];

    });


}

- (void)ZFJContentCaptureWithoutOffsetCompletionHandler:(void(^)(UIImage *capturedImage))completionHandler{

    UIView *containerView = [[UIView alloc]initWithFrame:self.bounds];


    CGRect bakFrame = self.frame;

    UIView *bakSuperView = self.superview;

    NSInteger bakIndex = [self.superview.subviews indexOfObject:self];


    [self removeFromSuperview];

    [containerView addSubview:self];


    CGSize totalSize = self.scrollView.contentSize;


    float page = floorf(totalSize.height/containerView.bounds.size.height);


    self.frame = CGRectMake(0, 0, containerView.bounds.size.width, self.scrollView.contentSize.height);

    UIGraphicsBeginImageContextWithOptions(totalSize, false, [UIScreen mainScreen].scale);

    [self ZFJContentPageDrawTargetView:containerView index:0 maxIndex:(int)page drawCallback:^{

        UIImage *capturedImage = UIGraphicsGetImageFromCurrentImageContext();

        UIGraphicsEndImageContext();


        [self removeFromSuperview];

        [bakSuperView insertSubview:self atIndex:bakIndex];


        self.frame = bakFrame;


        [containerView removeFromSuperview];


        completionHandler(capturedImage);

    }];


}

- (void)ZFJContentPageDrawTargetView:(UIView *)targetView index:(int)index maxIndex:(int)maxIndex drawCallback:(void(^)(void))drawCallback{

    CGRect splitFrame = CGRectMake(0, (float)index * targetView.frame.size.height, targetView.bounds.size.width, targetView.frame.size.height);


    CGRect myFrame = self.frame;

    myFrame.origin.y = - ((float)index * targetView.frame.size.height);

    self.frame = myFrame;


    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

        [targetView drawViewHierarchyInRect:splitFrame afterScreenUpdates:YES];


        if(index<maxIndex){

            [self ZFJContentPageDrawTargetView:targetView index:index + 1 maxIndex:maxIndex drawCallback:drawCallback];

        }else{

            drawCallback();

        }

    });

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。