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

时间:2011-11-08 20:21:55

标签: iphone ios cocoa-touch

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

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

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

以下是HomeViewController的一个片段:

- (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的摘录:

- (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 个答案:

答案 0 :(得分:0)

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

如果从该阵列中轻轻摇动removeAllObjects