2012-03-19 5 views
0

デリゲートメソッドのdrawLayer:inContextを使用して、小さなボックスが画面を移動する際の背景の不透明度を変更しています。このレイヤーは、UIImageが初期化されたときにコンテンツとして設定されていました。drawLayer:inContextを使用しているときにUIImageのコンテンツが消える(再表示される)

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

2つのレイヤーが必要な場合があります.1つは背景を描画し、もう1つはイメージです。画像レイヤの不透明度プロパティを変更します。設定によっては、レイヤーの1つが他のレイヤーの下位レイヤーになる可能性があります。そのように構成する方が簡単な場合があります。 –

+0

それはまさに私がやったことです。 2つのレイヤーを、画像レイヤーを別のレイヤーのサブレイヤーとして使用し、画像レイヤーの不透明度を変えるだけです。今すぐ素晴らしい作品!ありがとう! – astoffel

関連する問題