年年有"余"

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3957|回复: 3

监听屏幕触摸事件实现涂鸦

[复制链接]
  • TA的每日心情

    2024-10-15 10:05
  • 签到天数: 372 天

    [LV.9]以坛为家II

    发表于 2014-12-19 17:40:37 | 显示全部楼层 |阅读模式
    一、直接上图

    iOS-Simulator-Screen-Shot-2014年12月19日-下午5.09.07.png iOS-Simulator-Screen-Shot-2014年12月19日-下午5.13.07.png iOS-Simulator-Screen-Shot-2014年12月19日-下午5.15.02.png

    二、设计说明

    1、UIView继承自UIResponder,UIResponder能响应所有的事件与用户进行交互,如:触摸事件(单点/多点触控)、加速事件(重力感应)、远程事件(耳机播放/暂停/下一曲)

    2、触摸事件主要涉及以下4个方法

    // 开始触屏时调用,只调用一次
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;

    // 屏幕上移动时调用,反复调用且频率较高
    - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;

    // 离开屏幕时调用,只调用一次
    - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;

    // 中断时调用,如被来电中断
    - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;


    3、结合上述相关方法,使用Quartz2D绘制图形到当前视图

    4、将图形保存到本地相册

    三、关键代码
    1. #import "SAView.h"
    2. @implementation SAView
    3. #pragma mark - 初始化
    4. - (NSMutableArray *)paths
    5. {
    6.     if (_paths == nil) {
    7.         _paths = [NSMutableArray array];
    8.     }
    9.     return _paths;
    10. }
    11. // 图层渲染方法,每调用setNeedsDisplay方法都会调用此方法
    12. - (void)drawRect:(CGRect)rect
    13. {
    14.     for (UIBezierPath *path in self.paths) {
    15.         [path stroke];
    16.     }
    17. }
    18. #pragma mark - 触摸事件处理
    19. // 开始涂鸦(以每一笔为基本单位),接触屏幕时调用一次
    20. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    21. {
    22.     NSLog(@"touchesBegan");
    23.     // 创建一个贝赛尔曲线对象,设置相关属性(圆角线条、线条粗细)
    24.     UIBezierPath *path = [UIBezierPath bezierPath];
    25.     path.lineCapStyle = kCGLineCapRound;
    26.     path.lineJoinStyle = kCGLineJoinRound;
    27.     path.lineWidth = 5;
    28.    
    29.     // 通过touch事件获取位置变化传入给贝赛尔曲线
    30.     CGPoint point = [[touches anyObject] locationInView:self];
    31.     [path moveToPoint:point];
    32.    
    33.     // 将该曲线对象加入到数组
    34.     [self.paths addObject:path];
    35.    
    36.     // 刷新图层
    37.     [self setNeedsDisplay];
    38. }
    39. // 移动手指,手指移动时会反复调用,频率较高
    40. - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
    41. {
    42.     NSLog(@"touchesMoved");
    43.     /* 获取当前画笔跟随触摸移动继续绘制
    44.      * 该方法调用频率非常高,一点点移动都会调用多次
    45.      * 所以画出的多条折线视觉上是连续的
    46.      */
    47.     UIBezierPath *path = [self.paths lastObject];
    48.     CGPoint point = [[touches anyObject] locationInView:self];
    49.     [path addLineToPoint:point];
    50.    
    51.     // 刷新图层
    52.     [self setNeedsDisplay];
    53.    
    54. }
    55. // 结束触摸,即手指离开时调用一次
    56. - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
    57. {
    58.     NSLog(@"touchesEnded");
    59.     [self touchesMoved:touches withEvent:event];
    60. }
    61. #pragma mark - 按钮事件处理
    62. // 回退,即移除上一个画笔对象
    63. - (IBAction)back:(id)sender
    64. {
    65.     [self.paths removeLastObject];
    66.     [self setNeedsDisplay];
    67. }
    68. // 清除,移除所有画笔对象
    69. - (IBAction)clean:(id)sender
    70. {
    71.     [self.paths removeAllObjects];
    72.     [self setNeedsDisplay];
    73. }
    74. // 保存图片到本地相册
    75. - (IBAction)save:(id)sender
    76. {
    77.     // 开启图片上下文
    78.     UIGraphicsBeginImageContext(self.frame.size);
    79.    
    80.     // 将当前view上内存渲染到当前上下文
    81.     [self.layer renderInContext:UIGraphicsGetCurrentContext()];
    82.    
    83.     // 将当前上下文内容转换为图片对象
    84.     UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    85.    
    86.     // 关闭图片上下文
    87.     UIGraphicsEndImageContext();
    88.    
    89.     // 将图片保存到本地相册
    90.     UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
    91. }
    92. @end
    复制代码
    四、Demo下载:
    游客,如果您要查看本帖隐藏内容请回复
  • TA的每日心情
    犯困
    2015-1-11 14:36
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2015-6-26 15:52:58 | 显示全部楼层
    感谢楼主的分享
  • TA的每日心情
    恶心
    2015-11-23 14:20
  • 签到天数: 92 天

    [LV.6]常住居民II

    发表于 2015-6-29 09:05:45 | 显示全部楼层
    很不错 , 学习学习 !

    该用户从未签到

    发表于 2015-7-7 00:27:51 | 显示全部楼层
    很好很强大
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    手机版|小黑屋|Archiver|iOS开发笔记 ( 湘ICP备14010846号 )

    GMT+8, 2024-11-22 01:04 , Processed in 0.056207 second(s), 23 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表