0

モーダルビューコントローラーとして表示されるビューにimageViewを追加し、スタイルを水平方向に反転させました。imageViewをアニメーション化するために次のコードを追加しました。

- (void)animateTheImageview:(UIImageView*) imageViewToAnimate{
    
    CABasicAnimation *fadeAnimation;
    fadeAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
    fadeAnimation.duration = 1.5;
    fadeAnimation.repeatCount = INFINITY;
    fadeAnimation.autoreverses = NO;
    fadeAnimation.fromValue = [NSNumber numberWithFloat:1.0];
    fadeAnimation.toValue = [NSNumber numberWithFloat:0.5];
    fadeAnimation.removedOnCompletion = YES;
    fadeAnimation.fillMode = kCAFillModeForwards;
    [imageViewToAnimate.layer addAnimation:fadeAnimation forKey:@"animateOpacity"]; 
}


- (void)switchOnorOff
 {
    
    if (onOffSwitch.on)
    {
        
        self.lightImage.image = [UIImage imageNamed:@"CFLGlow.jpg"];
        [self animateTheImageview:self.lightImage];
    }
    else
    {
        
        self.lightImage.image = [UIImage imageNamed:@"CFL-BULB.jpg"];
        [self.lightImage.layer removeAllAnimations];
    }
}

そして、私はこのメソッドをviewDidLoad:から呼び出しています。

- (void)viewDidLoad
   {
      [self switchOnorOff];
   }

私の問題は、上記のコードがimageViewをアニメーション化しないことです。

しかし、私が以下のコードを試したとき、それは機能します:

[self performSelectorOnMainThread:@selector(animateTheImageview:) withObject:self.lightImage waitUntilDone:YES];

私の質問は、なぜこの問題が発生しているのかということです。の間に違いはありますか、

[self performSelectorOnMainThread:@selector(animateTheImageview:) withObject:self.lightImage waitUntilDone:YES];

[self animateTheImageview:self.lightImage];

4

1 に答える 1

6

viewDidLoadでアニメーションを実行しないでください。また、オーバーライドしているだけなので、その中で[superviewDidLoad]を呼び出す必要があります。viewWillAppearまたはviewDidAppearに表示してみてください。

次に、 NSObjectリファレンスに従って、performSelectorOnMainThread:withObject:waitUntilDone:

メインスレッドの実行ループでメッセージをキューに入れます

そのため、アニメーションを実行する前に、キューにある他のメッセージが最初に完了する場合があります。

お役に立てれば

于 2012-10-25T09:59:37.997 に答える