2012-04-08 16 views
1

この1つは私を悩ましています。私が持っている私はこのようなUIViewControllerviewDidLoad方法何かで作成したCALayerCALayerはコンテンツを表示しません

- (void)viewDidLoad { 

    [super viewDidLoad]; 

    UIImage* img = [UIImage imageNamed:@"foo.png"]; 

    _imageLayer = [[CALayer alloc] init]; 

    _imageLayer.bounds = CGRectMake(0, 0, img.size.width, img.size.height); 
    _imageLayer.position = CGPointMake(self.view.bounds.size.width/2.0, self.view.bounds.size.height/2.0); 

    _imageLayer.contents = (id)img.CGImage; 
    _imageLayer.contentsScale = img.scale; 

    [self.view.layer addSublayer:_imageLayer]; 
    [_imageLayer setNeedsDisplay]; 
} 

UIViewControllerは、ペン先からロードされたコードで作成されたUITabBarControllerに配置されます。

私の問題は、UIViewControllerが表示されたときにCALayerがそのUIImageの内容を表示しないということです。私がCALayerUIImageにレンダリングさせる唯一の方法は、viewDidAppear:メソッドのように、UIViewControllerが可視になった後にその内容をUIImageに設定することです。

viewDidLoadの方法ですべての設定を行うのが本当に好きです(それは何のためですか?)。 CALayerにコンテンツを表示させるにはどうすればよいですか?

+0

新しいレイヤー(変更されていない)で '-setNeedsDisplay'を呼び、ビューのレイヤーではないのはなぜですか? –

+0

レンダリングするだけの簡単な試みです。 – kamprath

+0

ああ待って、私はあなたのポイントを参照してください。 '[_imageLayer setNeedsDisplay];を取り除くとうまくいきます。そこには何が起こっていますか? – kamprath

答えて

3

レイヤーまたはスーパービューにはsetNeedsDisplayは必要ありません。

setNeedsDisplayは、コンテンツを再描画する必要があることをレイヤまたはビューに通知します。 (ビューでは、新しいコンテンツを取得するためにdrawRect:が呼び出されますが、CALayerの場合はデリゲートに問い合わせます)。これは、ビューまたはレイヤー自体にのみ影響し、子には影響しません。

レイヤーのコンテンツを直接提供しているため、CAがそのコンテンツを破棄して置き換えを依頼することはありません。

関連する問題