iPhone - 在屏幕上绘图以响应触摸事件

Posted

技术标签:

【中文标题】iPhone - 在屏幕上绘图以响应触摸事件【英文标题】:iPhone - Drawing on the screen in response to touch event 【发布时间】:2011-11-08 20:21:55 【问题描述】:

我正在为一门课做作业,需要一些指导。我正在使用一个将触摸事件和随后的手指拖动转换为屏幕上的绘图的应用程序。我需要弄清楚如何将每个绘图保存在一个数组中,并在响应抖动事件时将它们全部删除。

它非常基本 - 有一个 HomeViewController (UIViewController) 和一个占据窗口的 DoodleView (UIView)。 HomeViewController 有一个doodleview 属性,在viewDidLoad 方法中,创建一个实例,赋值给self.doodleview,然后调用addSubview。 touchesBegan、touchesMoved 和 touchesEnded 方法属于 doodleview 类。现在,每次单击和拖动都会删除前一个。

我最初尝试保存它们,是创建 HomeViewController 的 NSMutableArray“doodleViews”属性,认为每个 touchesBegan 事件都在创建一个新的 doodleView 实例,并且只是在该数组的最后一个元素上调用 addSubview。这没有用,我不知道为什么。任何提示都表示赞赏。

这是来自 HomeViewController 的 sn-p:

- (void)viewDidLoad 
    [super viewDidLoad];

    CGRect window = [[UIScreen mainScreen] bounds];
    self.doodleView = [[DoodleView alloc] initWithFrame:window];

    CircleGestureRecognizer *recognizer = [[CircleGestureRecognizer alloc] initWithTarget:self action:@selector(handleCircleRecognizer:)]; 
    [self.doodleView addGestureRecognizer:recognizer];

    [self.view addSubview:self.doodleView];


这是来自 DoodleView 的 sn-p:

- (void) touchesBegan:(NSSet *) touches withEvent:(UIEvent *) event

    NSLog(@"touches began");

    path = [UIBezierPath bezierPath];   
    path.lineWidth = 15.0f;
    path.lineCapStyle = kCGLineCapRound;
    path.lineJoinStyle = kCGLineJoinRound;

    UITouch *touch = [touches anyObject];
    [path moveToPoint:[touch locationInView:self]];


- (void) touchesMoved:(NSSet *) touches withEvent:(UIEvent *) event

    UITouch *touch = [touches anyObject];
    [path addLineToPoint:[touch locationInView:self]];
    [self setNeedsDisplay];


- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

    UITouch *touch = [touches anyObject];
    [path addLineToPoint:[touch locationInView:self]];
    [self setNeedsDisplay];

【问题讨论】:

【参考方案1】:

您可能希望在touchesEnded 方法中将UIBezierPath *path 保存到NSMutableArray。然后在您的绘图代码中遍历数组并绘制每个路径。

当有震动时,只需从该数组中removeAllObjects

【讨论】:

我已经尝试过了,当我这样做时,我得到了 0 个元素:[self.drawings addObject:path]; NSLog(@"%d",self.drawings.count);此外,绘图是实时发生的,因此随着手指的移动,drawRect 被调用,[path stroke] 随之调用。 @大卫;我面前没有那种类型的项目可以看,但是。你试过 [self.drawing addObject:[path copy]] 吗?

以上是关于iPhone - 在屏幕上绘图以响应触摸事件的主要内容,如果未能解决你的问题,请参考以下文章

在 iPhone 上使用 Quartz 时如何保留之前的绘图?

说说iOS中的手势及触摸

UIResponder 类中的触摸事件响应方法

在 iPhone 上处理多次触摸

iOS中最早的注册触摸事件

Android官方开发文档Training系列课程中文版:OpenGL绘图之响应触摸事件