iOS - Quartz 2D 手势截屏绘制

  1. 云栖社区>
  2. 博客>
  3. 正文

iOS - Quartz 2D 手势截屏绘制

QianChia 2016-09-16 23:05:00 浏览374
展开阅读全文

1、绘制手势截屏

  • 具体实现代码见 GitHub 源码 QExtension

  • QTouchClipView.h

        @interface QTouchClipView : UIView
    
        /**
         *  创建手势截屏视图控件,获取截屏结果
         *
         *  @param view     截取图片的视图控件
         *  @param result   手势截屏结果
         *
         *  @return 手势截屏视图控件
         */
        + (instancetype)q_touchClipViewWithView:(UIView *)view
                                     clipResult:(void (^)(UIImage * _Nullable image))result;
    
        @end
  • QTouchClipView.m

        @interface QTouchClipView ()
    
        /// 截取图片的视图控件
        @property (nonatomic, strong) UIView *baseView;
    
        /// 滑动手势结果
        @property (nonatomic, copy) void (^resultBlock)(UIImage * _Nullable);
    
        /// 触摸开始结束点
        @property (nonatomic, assign) CGPoint startP;
        @property (nonatomic, assign) CGPoint endP;
    
        @end
    
        @implementation QTouchClipView
    
        /// 创建手势截屏视图控件,获取截屏结果
        + (instancetype)q_touchClipViewWithView:(UIView *)baseView
                                     clipResult:(void (^)(UIImage * _Nullable image))result {
    
            QTouchClipView *clipView = [[self alloc] initWithFrame:baseView.frame];
    
            clipView.baseView = baseView;
            clipView.resultBlock = result;
    
            return clipView;
        }
    
        /// 初始化
        - (instancetype)initWithFrame:(CGRect)frame {
    
            if (self = [super initWithFrame:frame]) {
                self.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.5];
            }
            return self;
        }
    
        /// 触摸开始
        - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event {
    
            // 获取触摸起始点位置
            CGPoint startPoint = [touches.anyObject locationInView:self];
            self.startP = startPoint;
        }
    
        /// 触摸移动
        - (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event {
    
            // 获取触摸点位置
            CGPoint touchPoint = [touches.anyObject locationInView:self];
            self.endP = touchPoint;
    
            // 刷新视图
            [self setNeedsDisplay];
        }
    
        /// 触摸结束
        - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event {
    
            // 截取屏幕图片
            UIGraphicsBeginImageContextWithOptions(self.baseView.bounds.size, NO, 0);
    
            CGContextRef ctx = UIGraphicsGetCurrentContext();
            [self.baseView.layer renderInContext:ctx];
    
            UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    
            UIGraphicsEndImageContext();
    
            // 切割图片
            CGFloat x = self.startP.x;
            CGFloat y = self.startP.y;
            CGFloat w = self.endP.x - x;
            CGFloat h = self.endP.y - y;
    
            CGRect cutRect = CGRectMake(x * 2, y * 2, w * 2, h * 2);
    
            CGImageRef cgImage = CGImageCreateWithImageInRect(image.CGImage, cutRect);
            UIImage *newImage = [[UIImage alloc] initWithCGImage:cgImage];
            CGImageRelease(cgImage);
    
            // 返回截取结果
            if (self.resultBlock) {
                self.resultBlock(newImage);
            }
    
            // 移除截取视图控件
            [self removeFromSuperview];
            self.startP = CGPointZero;
            self.endP = CGPointZero;
    
            // 刷新视图
            [self setNeedsDisplay];
        }
    
        /// 触摸取消
        - (void)touchesCancelled:(NSSet *)touches withEvent:(nullable UIEvent *)event {
            [self touchesEnded:touches withEvent:event];
        }
    
        /// 绘制触摸区域
        - (void)drawRect:(CGRect)rect {
    
            CGFloat x = self.startP.x;
            CGFloat y = self.startP.y;
            CGFloat w = self.endP.x - x;
            CGFloat h = self.endP.y - y;
    
            CGRect clipRect = CGRectMake(x, y, w, h);
    
            UIBezierPath *path = [UIBezierPath bezierPathWithRect:clipRect];
            [[[UIColor whiteColor] colorWithAlphaComponent:0.2] setFill];
            [path fill];
        }
    
        @end
  • ViewController.m

        // 创建手势截屏视图
        QTouchClipView *touchClipView = [QTouchClipView q_touchClipViewWithView:self.imageView
                                                                     clipResult:^(UIImage * _Nullable image) {
    
            // 获取处理截屏结果
            if (image) {
                UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
            }
        }];
    
        // 添加手势截屏视图
        [self.view addSubview:touchClipView];
  • 效果

    Quartz2D100Quartz2D101

网友评论

登录后评论
0/500
评论
QianChia
+ 关注