1

Mit Xcode Version 7.2.1 (7C1002), SDK iOS 9.2animateWithDuration arbeiten nicht in viewWillAppear ios 9 Ziel c

Der Versuch, animieren Imageview von (offscreen) links nach rechts und haben die Animation wiederholen . Ich weiß, dass die Animation in viewDidLoad wie gewünscht funktioniert, aber es ist nicht ideal, da die Animation aufhört, wenn ein neuer Controller präsentiert wird oder die App in den Hintergrund und zurück in den Vordergrund gegangen ist. Ich möchte, dass die Animation neu startet, wenn der Controller erneut angezeigt wird. Wenn ich den Code in die Ansicht verschiebe, wird die Animation nicht ausgeführt.

Ich habe versucht:

  1. Zugabe perform mit einer Verzögerung von 3 Sekunden -> nicht
  2. Einwickeln der animateWithDuration in dispatch_async nicht animieren (dispatch_get_main_queue()^{...}); -> nicht animiert nicht
  3. Überschreibung viewDidLayoutSubviews Methode und Animation Code aufrufe von dort -> nicht animiert nicht

das einzig Mal, wenn die Animation funktioniert, wenn von viewDidLoad genannt wird. Jede Hilfe wäre willkommen. Ich muss etwas wirklich Offensichtliches vermissen. hier ist der Code (was nicht funktioniert) ...

MainViewController.h

@property (nonatomic, strong) IBOutlet UIImageView *movingL2R_1_ImageView; 
@property (nonatomic) IBOutlet NSLayoutConstraint *movingL2R_1_LeadingConstraint; 

MainViewController.m

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [self startAnimations]; 
} 

-(void) startAnimations{ 
    [self animateMovingL2R_1_ImageView]; 
    // other animations will go here... 
} 

-(void) animateMovingL2R_1_ImageView { 

    NSTimeInterval animateInterval = 15; 

    [UIView animateWithDuration:animateInterval delay:0 options:UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionRepeat animations:^{ 

     self.movingL2R_1_LeadingConstraint.constant = 500; 
     [self.movingL2R_1_ImageView layoutIfNeeded]; 

    } completion:^(BOOL finished) { 
     // back to original position 
     self.movingL2R_1_LeadingConstraint.constant = -100; 
    }]; 
} 

HINWEIS: die movingL2R_1_LeadingConstraint auf -100 gesetzt in Interface Builder, so dass es dort ist, wo es startet.

Storyboard Einstiegspunkt -> MainController

+0

Wenn Sie sagen, es funktioniert, wenn von 'viewDidLoad' aufgerufen, meinst du wirklich' viewDidAppear'? Denn das sehe ich in Ihrem Code, den Sie gepostet haben. – Gavin

+0

sollte es in ViewDidAppear arbeiten, aber nicht in ViewDidLoad –

+0

@Gavin - Sorry, um zu klären, ich habe den Code veröffentlicht, der nicht funktioniert. Die Animation funktioniert beim Aufruf von [self startAnimations] in viewDidLoad (natürlich den Aufruf in viewDidAppear auskommentieren) – tdios

Antwort

2

Wie bereits erwähnt, funktioniert der Code oben perfekt, wenn [self startAnimations]; in viewDidLoad genannt wird, aber nicht in viewDidAppear, aber this answer helped me discover the subtle issue.

Um es in viewDidAppear Arbeit brauchte ich

[self.movingL2R_1_ImageView layoutIfNeeded];

mit

[self.view layoutIfNeeded];

alles in Ordnung mit der Welt ist wieder zu ersetzen.