1

これは私を困惑させています。私は次のような'sメソッドCALayerで作成した を持っています:UIViewControllerviewDidLoad

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

UIViewControllernib からロードさUITabBarControllerれ、コードで作成された に配置されます。

私の問題は、が表示されたときにコンテンツがCALayerレンダリングされないことです。をレンダリングできるようにする唯一の方法は、メソッドのように、が表示された後にその内容を に設定することです。UIImageUIViewControllerCALayerUIImageUIImageUIViewControllerviewDidAppear:

メソッドですべてのセットアップを行うことを本当に望んでいますviewDidLoad(それが目的ではないでしょうか?)。CALayerコンテンツをレンダリングするにはどうすればよいですか?

4

1 に答える 1

3

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

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

レイヤーのコンテンツを直接提供しているため、CA がそのコンテンツを破棄して交換を要求することは望ましくありません。

于 2012-04-08T07:10:08.803 に答える