iPhone — пытаюсь нарисовать линию на CALayer

#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. чувак, ты гений!!!! Я исправил опечатку в вашем ответе, и теперь она работает отлично. Ч А Н К С!!!!