CALayer - очистить внутренний контекст рендеринга в пользу пользовательского кода рисования - PullRequest
0 голосов
/ 25 марта 2011

При создании подкласса CALayer и реализации метода drawInContext я бы предположил, что любой чертеж, который я делаю внутри, есть все, что будет отображаться, но вместо этого, если я установлю (например) borderWidth / borderColor, тогда CALayer нарисует границупревыше всего мой пользовательский код рисования.

Это подкласс CALayer:

@implementation MyCustomCALayer </p> <pre><code>- (id)init { self = [super init]; if(self) { [self setNeedsDisplayOnBoundsChange:YES]; } return self; } - (void)drawInContext:(CGContextRef)context { CGRect rect = CGContextGetClipBoundingBox(context); CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor); CGContextFillRect(context, rect); } @end

Создано в UIView что-то вроде:

- (void)ensureLayer<br> {<br> if(myLayer)<br> return; </p> <pre><code> myLayer = [[[MyCustomCALayer alloc] init] autorelease]; myLayer.borderColor = [UIColor greenColor].CGColor; myLayer.borderWidth = 1; myLayer.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height); } - (void)layoutSublayersOfLayer:(CALayer *)layer { [super layoutSublayersOfLayer:layer]; [self ensureLayer]; if(![[layer.sublayers objectAtIndex:0] isEqual:myLayer]) [layer insertSublayer:myLayer atIndex:0]; }

Что происходит, если MyCustomCALayer заполняет прямоугольник красным, этоэто то, что я ожидал увидеть, и ничего больше, поскольку я реализовал метод drawInContext, но вместо этого я вижу красный прямоугольник с зеленой рамкой сверху, всегда сверху, я пробовал практически все комбинации, которые могу придуматьчтобы избавиться от нарисованной зеленой границы и не могу ее понять.

Я считаю, что я хотел бы использовать borderWidth и borderColor и другие свойства CALayer вместо создания своего собственногосвойства, потому что код, который мне нужно нарисовать, содержит рамку, заливку и т. д., но рендеринг, который мне нужно сделать, не является простой формой.Таким образом, единственный способ, который я нашел для этого, - установить для borderWidth значение 0 и добавить свое собственное свойство в мой подкласс, например myBorderWidth, что нелепо.

Это сделано с помощью последней версии iOS SDK, но ямог бы представить, что то же самое для Mac.

Надеюсь, это имеет смысл, есть мысли?

Спасибо!

1 Ответ

1 голос
/ 02 апреля 2011

Вам не повезло; CoreAnimation не поддерживает переопределение своей реализации рендеринга для базовых свойств слоя. Пожалуйста, сообщите об ошибке .

...