iOS - Quartz 2D 手势截屏绘制

简介: 1、绘制手势截屏具体实现代码见 GitHub 源码 QExtensionQTouchClipView.h @interface QTouchClipView : UIView /** * 创建手势截屏视图控件,获取截屏结果 * * @par...

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

目录
相关文章
|
iOS开发
(六)IOS手势和触摸的用法
(六)IOS手势和触摸的用法
246 0
|
iOS开发
iOS开发-聊天气泡的绘制和聊天消息列表
iOS开发-聊天气泡的绘制和聊天消息列表
275 0
iOS开发-聊天气泡的绘制和聊天消息列表
|
API iOS开发
iOS手势与变形
手势在用户交互中有着举足轻重的作用,这篇文字简单的介绍了iOS中的手势,并通过手势对控件进行变形处理。
150 0
|
iOS开发
如何使用iOS手势UIGestureRecognizer
如何使用iOS手势UIGestureRecognizer
125 0
|
iOS开发
IOS给任意UIView截屏
IOS给任意UIView截屏
195 0
|
数据安全/隐私保护 iOS开发
iOS 手势密码锁
首先看一下效果
140 0
|
JSON 搜索推荐 Serverless
iOS绘制物理按钮 - 透明圆角渐变边框
iOS绘制物理按钮 - 透明圆角渐变边框
418 0
|
iOS开发 MacOS
IOS之Quartz
IOS之Quartz
166 0
IOS之Quartz
|
iOS开发
iOS开发UI篇 - Quartz 2D简单使用
iOS开发UI篇 - Quartz 2D简单使用
iOS开发UI篇 - Quartz 2D简单使用
|
设计模式 iOS开发
iOS手势全埋点
iOS手势全埋点
248 0
iOS手势全埋点

热门文章

最新文章

  • 1
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
  • 2
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 3
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 4
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 5
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
  • 6
    iOS各个证书生成细节
  • 7
    iOS|记一名 iOS 开发新手的前两次 App 审核经历
  • 8
    iOS:应用程序的线程安全性
  • 9
    iOS开发-UIScrollView原理
  • 10
    iOS - Swift NSPoint 位置
  • 1
    iOS|记一名 iOS 开发新手的前两次 App 审核经历
    9
  • 2
    iOS各个证书生成细节
    22
  • 3
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    117
  • 4
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    40
  • 5
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    55
  • 6
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    46
  • 7
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    40
  • 8
    uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
    152
  • 9
    【05】2025年1月首发完整版-篇幅较长-苹果app如何上架到app store完整流程·不借助第三方上架工具的情况下无需花钱但需仔细学习-优雅草央千澈详解关于APP签名以及分发-们最关心的一篇来了-IOS上架app
    303
  • 10
    app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
    106