drawLayer: inContext не вызывается - PullRequest
       0

drawLayer: inContext не вызывается

3 голосов
/ 27 октября 2010

У меня есть свой собственный минимальный класс представления с этим:

- (void) awakeFromNib
{
    NSLog(@"awakeFromNib!");
    [self.layer setDelegate:self];
    [self.layer setFrame:CGRectMake(30, 30, 250, 250)];
    self.layer.masksToBounds = YES;
    self.layer.cornerRadius = 5.0;
    self.layer.backgroundColor = [[UIColor redColor] CGColor];
    [self setNeedsDisplay];
}

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
    NSLog(@"drawing!");
}

drawLayer: inContext никогда не вызывается, хотя я могу видеть слой как красный прямоугольник с закругленными углами.Чего мне не хватает?

РЕДАКТИРОВАТЬ: из документов Apple

Вы можете рисовать контент для своего слоя или лучше инкапсулировать настройку изображения контента слоя, создав класс делегата, который реализует один изследующие методы: displayLayer: или drawLayer: inContext:.

Реализация метода делегата для отрисовки содержимого не приводит к автоматическому отрисовке слоя с использованием этой реализации.Вместо этого вы должны явно указать экземпляру слоя на повторное кэширование содержимого, отправив ему setNeedsDisplay или setNeedsDisplayInRect: message или установив его свойство needsDisplayOnBoundsChange в YES.

Также

drawLayer: inContext:

Если определено, вызывается реализацией drawInContext по умолчанию:.

1 Ответ

9 голосов
/ 27 октября 2010

Вы никогда не должны изменять делегата слоя UIView.Из документации свойства слоя UIView:

Предупреждение. Поскольку представление является делегатом слоя, вы никогда не должны устанавливать представление в качестве делегата другого объекта CALayer.Кроме того, вы никогда не должны изменять делегата этого слоя.

Если вы хотите сделать пользовательское рисование в виде, просто переопределите метод drawRect:

Если вы хотите использоватьСлои, которые вам нужно создать:

UIView *myView = ...
CALayer *myLayer = [CALayer layer];
myLayer.delegate = self;
[myView.layer addSublayer:myLayer];

В обоих случаях вам нужно вызвать setNeedsDisplay для вида в первом случае и для вашего пользовательского слоя во втором.Вы никогда не вызываете drawRect: или drawLayer: inContext: напрямую, они вызываются автоматически при вызове setNeedsDisplay.

...