2012-03-19 2 views
0

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

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

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

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

- (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]; 
} 

ответ

0

Не использовать -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; 
} 

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

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

+0

Это, безусловно, имеет больше смысла. Что делать, если я хотел только изменить непрозрачность изображения содержимого, но оставить цвет фона тем же? (Я вызываю setNeedsDisplay на этом уровне.) – astoffel

+0

Возможно, вам понадобится два слоя, один для рисования фона, другой - изображение. Вы изменили бы свойство 'opacity' слоя изображения. В зависимости от вашей установки один из слоев может быть подслоем другого - это может упростить организацию этого пути. –

+0

Это именно то, что я сделал. 2 слоя с уровнем изображения в качестве подслоя другого, а затем просто изменяя непрозрачность слоя изображения. Прекрасно работает! Благодаря! – astoffel

Смежные вопросы