UIView transitionWithView ne fonctionne pas

Voici viewDidLoad du controller de vue principal du projet de test:

- (void)viewDidLoad 

{[super viewDidLoad];

 UIView *containerView = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 300, 300)]; [self.view addSubview:containerView]; UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 300)]; [redView setBackgroundColor:[UIColor redColor]]; [containerView addSubview:redView]; UIView *yellowView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 300)]; [yellowView setBackgroundColor:[UIColor yellowColor]]; [UIView transitionWithView:containerView duration:3 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{ [redView removeFromSuperview]; [containerView addSubview:yellowView]; } completion:NULL]; } 

La boîte jaune apparaît juste. Il n'y a pas d'animation, peu importe quelle UIViewAnimationOption j'essaie. Pourquoi???

EDIT: J'ai également essayé d'utiliser performSelector withDelay pour déplacer l'animation hors de viewDidLoad et dans une autre méthode. Même résultat – pas d'animation.

Également essayé ceci: [UIView transitionFromView: redView toView: durée yellowView: 3 options: UIViewAnimationOptionTransitionFlipFromLeft achèvement: NULL];

Pourtant, la vue jaune apparaît juste. Pas d'animation.

Après quelques tests, il apparaît que vous ne pouvez pas créer la vue du conteneur et configurer l'animation dans le même cycle de démarrage et que les choses fonctionnent. Pour que votre code fonctionne, j'ai d'abord créé containerView et redView dans la méthode viewDidLoad . Ensuite, j'ai mis votre animation dans la méthode viewDidAppear . Pour que je puisse referencer containerView et redView de la méthode viewDidAppear , je leur ai fait des propriétés. Voici le code d'un file ST_ViewController.m qui va exécuter l'animation que vous vouliez.

 @interface ST_ViewController () @property (nonatomic, strong) UIView *containerView; @property (nonatomic, strong) UIView *redView; @end @implementation ST_ViewController - (void)viewDidLoad { [super viewDidLoad]; [self setContainerView:[[UIView alloc] initWithFrame:CGRectMake(10, 10, 300, 300)]]; [[self view] addSubview:[self containerView]]; [self setRedView:[[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 300)]]; [[self redView] setBackgroundColor:[UIColor redColor]]; [[self containerView] addSubview:[self redView]]; } -(void)viewDidAppear:(BOOL)animated{ [super viewDidAppear:animated]; UIView *yellowView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 300)]; [yellowView setBackgroundColor:[UIColor yellowColor]]; [UIView transitionWithView:[self containerView] duration:3 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^(void){ [[self redView] removeFromSuperview]; [[self containerView] addSubview:yellowView]; } completion:nil]; } @end 

Ne mettez pas cela dans viewDidLoad . viewDidLoad est appelée lorsque la vue est entièrement chargée en memory, mais pas encore affichée à l'écran.

Essayez de placer le code ci-dessus dans viewDidAppear: qui est appelé lorsque la vue est apparue à l'écran.

Edit: une note de côté, si performSelector: withDelay: corrige quelque chose, cela signifie que vous essayez de faire quelque chose de mal. Vous devez refactoriser en quelque sorte. performSelector: withDelay: est la mauvaise façon de résoudre les problèmes 99,999% du time. Dès que vous placez ce code sur un périphérique de vitesse différente (nouvel iPhone, ancien iPhone), il va gâcher.