iPhone - пытается нарисовать линию на CALayer - PullRequest
0 голосов
/ 04 июня 2011

У меня есть класс 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 Ответ

6 голосов
/ 04 июня 2011

Вы объединяете слои и представления и используете CG API, когда вы легко можете использовать UIKit API.

в вашем методе init сделайте это;

- (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:. Но не делай так, делай то, что я показал выше. По большей части вам не нужно думать о слоях.

...