在NSMutableArray中保留UIBezierPaths

时间:2013-07-16 06:29:35

标签: ios objective-c nsmutablearray uibezierpath

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

路径和存储路径的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];  
}

问题是,在我绘制一条uibezier路径后,开始绘制一条uibezier路径后,我首先绘制的路径消失了。我不确定为什么会这样。提前谢谢!

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

2 个答案:

答案 0 :(得分: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];  
}

我希望将其存储在NSMutableArray中的touchesEnded

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

答案 1 :(得分:1)

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