Содержимое UIImage исчезает (и появляется вновь) при использовании drawLayer: inContext - PullRequest
0 голосов
/ 19 марта 2012

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

Каждый раз, когда вызывается drawLayer: inContext, изображение либо исчезает, либо появляется снова (переключаясь назад и вперед), вызывая заикание на экране.

У меня есть данные изображения в виде локального ивара в классе делегата, поэтому нет необходимости каждый раз перезагружать его.

Я не уверен, что вызвало это. Есть идеи? Вот код, который я использую:

- (id)init
{
    self = [super init];
    if(self) {
        UIImage *layerImage = [UIImage imageNamed:@"Hypno.png"];
        image = layerImage.CGImage;
    }
    return self;
}

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
    float alpha = layer.position.y / layer.superlayer.bounds.size.height;
    UIColor *reddish = [UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:alpha];
    CGColorRef cgReddish = reddish.CGColor;
    layer.backgroundColor = cgReddish;
    [layer setContents:(id)image];
}

1 Ответ

0 голосов
/ 19 марта 2012

Не используйте -drawLayer:inContext:. Этот метод предназначен для рисования в контексте CG, который затем станет содержимым уровня, используя методы Core Graphics или UIKit. Вы вообще не хотите изменять содержимое слоя - вы хотите, чтобы он был один раз вашим изображением, а затем никогда больше не трогал его.

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

(Также: для того, чтобы вызвать -drawLayer:inContext:, вы должны вызывать [layer setNeedsDisplay], или у вас включена функция needsDisplayOnBoundsChange слоя, или что-то подобное. Не делайте ничего из этого.)

Вместо этого попробуйте использовать механизм макета CALayer. Например, в делегате вашего слоя:

- (void)layoutSublayersOfLayer:(CALayer *)layer
{
    float alpha = layer.position.y / layer.superlayer.bounds.size.height;
    UIColor *reddish = [UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:alpha];
    CGColorRef cgReddish = reddish.CGColor;
    layer.backgroundColor = cgReddish;
}

Это будет вызвано как часть процесса отображения, каждый раз, когда для слоя или любого из его суперслоев будет вызван метод -setNeedsLayout. Часто это происходит автоматически, но в зависимости от того, что именно вызывает перемещение слоя, вам может потребоваться сделать это вручную. Попробуйте и посмотрите.

(В качестве альтернативы: поскольку у вас уже есть код, который меняет положение слоя, почему бы не изменить цвет фона слоя одновременно?)

...