CGContextDrawImage без анимации транзакции - PullRequest
0 голосов
/ 22 февраля 2012

Как нарисовать слой без анимации транзакции? Например, когда я устанавливаю содержимое слоя, используя CATransaction, оно работает хорошо:

[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue
                 forKey:kCATransactionDisableActions];
myLayer.contents = (id)[[imagesTop objectAtIndex:Number]CGImage];
[CATransaction commit];

но мне нужно изменить содержимое метода делегата [myLayer setNeedsDisplay]. Вот код:

-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context
{
    CGContextDrawImage(context, rect, Image.CGImage]);    
}

Ответы [ 2 ]

2 голосов
/ 22 февраля 2012

CALayer реализует setNeedsDisplay метод:

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

... и displayIfNeeded:

Когда это сообщение получено, слой вызовет display, если он был помечен как требующий отображения.

Если вы поместите [myLayer displayIfNeeded] в CATransaction, вы можете отключить неявную анимацию.

1 голос
/ 22 февраля 2012

Вы можете создать подкласс CALayer и переопределить actionForKey:,

- (id <CAAction>) actionForKey: (NSString *) key
{
    if ([key isEqualToString: @"contents"])
        return nil;
    return [super actionForKey: key];
}

Этот код отключает встроенную анимацию для свойства contents.

В качестве альтернативы, вы можете добиться того же эффекта, реализовав метод делегата слоя

- (id <CAAction>) actionForLayer: (CALayer *) layer forKey: (NSString *) key
{
    if (layer == myLayer) {
        if ([key isEqualToString: @"contents"])
            return nil;
        return [[layer class] defaultActionForKey: key];
    }
    return [layer actionForKey: key];
}
...