CABasicAnimation не работает, когда метод вызывается из viewDidLoad

У меня есть imageView, добавленный к представлению, представленному как modalViewController, со стилем горизонтального отражения. Я добавил следующий код для анимации 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];


person Midhun MP    schedule 25.10.2012    source источник


Ответы (1)


Вы не должны выполнять какую-либо анимацию в viewDidLoad, а также вызывать в нем [super viewDidLoad], поскольку вы просто переопределяете его. Попробуйте отобразить его на viewWillAppear или viewDidAppear.

Затем, согласно Справочник по NSObject, performSelectorOnMainThread: withObject: waitUntilDone:

ставит сообщение в очередь в цикле выполнения основного потока

Таким образом, другие сообщения в очереди могут завершиться первыми до выполнения анимации.

Надеюсь это поможет

person Snaker    schedule 25.10.2012
comment
Спасибо, возникла такая же проблема при размещении анимации в viewDidLoad внутри pageViewController. - person Curgo; 05.03.2014