美文网首页
iOS-WKWebView UIScrollView 全屏截图,

iOS-WKWebView UIScrollView 全屏截图,

作者: 夏至_未至_ | 来源:发表于2021-01-08 17:32 被阅读0次

    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();

            }

        });

    }

    相关文章

      网友评论

          本文标题:iOS-WKWebView UIScrollView 全屏截图,

          本文链接:https://www.haomeiwen.com/subject/vsmfaktx.html