CABasicAnimation is not working when the method is called from the viewDidLoad

你说的曾经没有我的故事 提交于 2019-12-12 05:13:17

问题


I have an imageView added to a view that's presented as a modalViewController, with style horizontal flip. I have added the following code for animating the 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];
    }
}

And I'm calling this method from the viewDidLoad:

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

My issue is the above code doesn't animate the imageView.

But when I tried the below code it works:

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

My question is why this issue is happening ? Is there any difference between,

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

and

[self animateTheImageview:self.lightImage];


回答1:


You should not perform any animation in the viewDidLoad, and also call [super viewDidLoad] in it since you're just overriding it. Try displaying it on viewWillAppear or viewDidAppear.

Then, according to the NSObject Reference, performSelectorOnMainThread:withObject:waitUntilDone:

queues the message on the run loop of the main thread

So the other messages on queue may complete first before performing the animation.

Hope this helps



来源:https://stackoverflow.com/questions/13065593/cabasicanimation-is-not-working-when-the-method-is-called-from-the-viewdidload

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!