Не используйте -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
. Часто это происходит автоматически, но в зависимости от того, что именно вызывает перемещение слоя, вам может потребоваться сделать это вручную. Попробуйте и посмотрите.
(В качестве альтернативы: поскольку у вас уже есть код, который меняет положение слоя, почему бы не изменить цвет фона слоя одновременно?)