2013-07-16 2 views
0

Я пытаюсь нарисовать несколько UIBezierPaths на пользовательском представлении, с возможностью управлять ими по отдельности.Сохранение UIBezierPaths в NSMutableArray

путь и 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]; 
} 

И я хочу сохранить его в NSMutableArray в touchesEnded:

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

Проблема заключается в том, после того, как я рисую один uibezierpath, и начать рисовать один за что, один я обратил первых, исчезает. Я не знаю, почему это происходит. Заранее спасибо!

Примечание: Я знаю, что возможное решение хранит все точки каждого uibezierpath в NSMutableArray и перерисовывает его каждый раз, когда вызывается drawRect, но я чувствую, что это неэффективная реализация.

+0

multi-touch нарушит эту реализацию. и нам нужно увидеть вашу функцию рисования –

+0

Возможно, вы захотите увидеть [GLPaint] (http://developer.apple.com/library/ios/#samplecode/GLPaint/Introduction/Intro.html) –

ответ

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]; 
} 
+0

'path' is not global, это переменная экземпляра. И то, как он это делает, имеет смысл, так как этот путь заканчивается в массиве, в то время как с вашей модификацией вы должны помнить, что последний путь _could_ все еще не завершен. – DarkDust

+0

Спасибо за ваш ответ, я сделал именно то, что вы сделали, указав путь локальной переменной метода и нарисовал ВСЕ uibezierpaths, как сказал DarkDust, и это сработало! –

1

Вы не показали вам drawRect: метод, но имейте в виду, что в вашем drawRect: вам необходимо нарисовать все пути, которые вы хотите отобразить. Каждый раз, когда вводится drawRect:, все, что вы рисовали раньше, очищается и должно быть снова нарисовано, поэтому просто рисование нового будет просто давать новый и ничего больше.

+0

Спасибо за ваш ответ, я объединил его с ответом iOS, и он сработал. Жаль, что я не могу принять ответы и голосовать, так как у меня нет репутации :( –

Смежные вопросы