#iphone #calayer #quartz-graphics
#iPhone #calayer #quartz-графика
Вопрос:
У меня есть класс UIView, который я использую для создания CALayer. Этот слой будет использоваться для рисования линий на основе касания.
Вот как определяется класс:
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self == nil) {
return nil;
}
self.layer.backgroundColor = [UIColor redColor].CGColor;
self.userInteractionEnabled = YES;
path = CGPathCreateMutable();
return self;
}
тогда у меня есть следующие строки в touchesBegan, touchesMoved и touchesEnded…
**touchesBegan**
CGPathMoveToPoint(path, NULL, currentPoint.x, currentPoint.y);
[self.layer setNeedsDisplay];
**touchesMoved**
CGPathAddLineToPoint(path, NULL, currentPoint.x, currentPoint.y);
[self.layer setNeedsDisplay];
**touchesEnded**
CGPathAddLineToPoint(path, NULL, currentPoint.x, currentPoint.y);
[self.layer setNeedsDisplay];
тогда у меня есть это
-(void)drawInContext:(CGContextRef)context {
CGContextSetStrokeColorWithColor(context, [[UIColor greenColor] CGColor]);
CGContextSetLineWidth(context, 3.0);
CGContextBeginPath(context);
CGContextAddPath(context, path);
CGContextStrokePath(context);
}
Вызываются методы touchesBegan / Moved / Ended, но этот метод drawInContext никогда не вызывается…
что я упускаю???
Спасибо.
Ответ №1:
Вы объединяете слои и представления и используете CG api, когда вы могли бы легко использовать UIKit api.
в вашем методе инициализации сделайте это;
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self == nil) {
return nil;
}
self.backgroundColor = [UIColor redColor];
// YES is the default for UIView, only UIImageView defaults to NO
//self.userInteractionEnabled = YES;
[self setPath:[UIBezierPath bezierPath]];
[[self path] setLineWidth:3.0];
return self;
}
В вашем коде обработки событий;
**touchesBegan**
[[self path] moveToPoint:currentPoint];
[self setNeedsDisplay];
**touchesMoved**
[[self path] addLineToPoint:currentPoint];
[self setNeedsDisplay];
**touchesEnded**
[[self path] addLineToPoint:currentPoint];
[self setNeedsDisplay];
Затем реализуйте drawRect:
следующим образом;
- (void)drawRect:(CGRect)rect {
[[UIColor greenColor] setStroke];
[[self path] stroke];
}
Я ввел это из памяти, поэтому оно может не скомпилироваться, оно может переформатировать ваш жесткий диск или вызвать захватчиков с Марса, чтобы вторгнуться в ваш дом. Ну, может быть, не это…
Вид является делегатом слоя, поэтому то, что у вас есть, сработало бы, если бы вы назвали свой метод рисования drawLayer:inContext:
. Но не делайте этого таким образом, делайте то, что я показал выше. По большей части вам не нужно думать о слоях.
Комментарии:
1. чувак, ты гений!!!! Я исправил опечатку в вашем ответе, и теперь она работает отлично. Ч А Н К С!!!!