0

我正在尝试在自定义视图上绘制多个 UIBezierPaths,并能够单独操作它们。

path 和存储路径的 NSMutableArray 是声明如下的实例变量:

@interface MyCustomView : UIView {  
    UIBezierPath *path;  
    NSMutableArray *paths; // this is initialized in the init method  
}

路径在 touchesBegan 中初始化如下:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event  
{  
    path = [[UIBezierPath alloc] init];  
    [path moveToPoint:[touch locationInView:self];  
}

它在 touchesMoved 方法中被移动如下:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event  
{  
    [path addLineToPath:[touch locationInView:self]];  
    [self setsNeedsDisplay];  
}

我想将它存储在 touchesEnded 的 NSMutableArray 中:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event  
{  
    [path closePath];  
    [paths addObject:path];
    [self setNeedsDisplay];  
}

问题是,在我画了一个uibezierpath,然后开始画一个之后,我先画的那个消失了。我不确定为什么会这样。提前致谢!

注意:我知道一个可能的解决方案是将每个 uibezierpath 的所有点存储在 NSMutableArray 中,并在每次调用 drawRect 时重新绘制它,但我觉得这是一个低效的实现。

4

2 回答 2

2

发生这种情况是因为您使用的是全局实例 path。无需使用全局实例,而是将路径对象添加到可变数组并到达您想要的任何地方。

尝试像这样替换您的代码。

   @interface MyCustomView : UIView {  
        NSMutableArray *paths; // this is initialized in the init method  
    }

路径初始化touchesBegan如下:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event  
{  
    UIBezierPath *path = [[UIBezierPath alloc] init];  
    [path moveToPoint:[touch locationInView:self]; 
    [paths addObject:path]; 
}

它在touchesMoved方法中移动如下:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event  
{  
    UIBezierPath *path = [paths lastObject];
    [path addLineToPath:[touch locationInView:self]];  
    [self setsNeedsDisplay];  
}

我想将它存储在NSMutableArrayin touchesEnded

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event  
{  
    UIBezierPath *path = [paths lastObject];
    [path closePath];  
    [self setNeedsDisplay];  
}
于 2013-07-16T06:40:03.930 回答
1

您没有向您展示drawRect:方法,但请注意,在您的 中drawRect:,您需要绘制所有要显示的路径。每次drawRect:输入,你之前绘制的所有内容都会被清除,并且必须再次绘制,所以只绘制新的只会给新的,而不是别的。

于 2013-07-16T06:56:57.953 回答