2013-03-20 1 views
10

Ich habe diese Ansicht, die autoresizingMask = UIViewAutoresizingFlexibleHeightConstraints basierte Layout nicht animiert, wenn die Statusleiste Höhe auf iOS ändert

Wenn die Statusleiste verwendet haben würde seine Höhe animieren (wie wenn ein Anruf auflegt), die Höhe der Ansicht würde animieren und erhöhen.

Aber mit Auto-Layout bin ersetzen ich dieses autoresizingMask mit Einschränkungen:

UIView *orangeView = [[UIView alloc] initWithFrame:CGRectZero]; 
orangeView.translatesAutoresizingMaskIntoConstraints = NO; 
orangeView.backgroundColor = [UIColor orangeColor]; 

[self.view addSubview:orangeView]; 

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[orangeView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(orangeView)]]; 
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(40)-[orangeView]-(190)-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(orangeView)]]; 

Aber jetzt wird die Veränderung in meinem Layout nicht mit der Statusleiste animiert, es ist nur ohne Animationen verändert.

Jetzt weiß ich, dass ich -layoutIfNeeded in einem Animationsblock aufrufen sollte, wenn Sie Constraints-basierte Layout verwenden. Aber hier bin ich nicht derjenige, der den Animationsblock erstellt! Gibt es also einen Weg, die Veränderung zu animieren?

Bedeutet das, dass ich einen Platz in meinem Code finden muss, der während dieses nicht initiierten Animationsblocks ausgeführt würde? Ich habe versucht, [self.view layoutIfNeeded] in meinem Controller zu setzen, wenn die UIApplicationWillChangeStatusBarFrameNotification ausgelöst wird, aber es funktioniert nicht.

+0

Haben Sie dieses Problem jemals gelöst? – AnthonyM

Antwort

2

Stellen Sie sicher, dass Sie Ihre Einschränkungen in der updateConstraints Methode hinzufügen.

Hier ist, was die docs sagen:

Benutzerdefinierte Ansichten, die Einschränkungen einrichten sich durch Überschreiben dieser Methode so tun sollten. Wenn Ihre benutzerdefinierte Ansicht feststellt, dass eine Änderung an der Ansicht vorgenommen wurde, die eine ihrer Integritätsbedingungen ungültig macht, sollte sie diese Integritätsbedingung sofort entfernen und dann setNeedsUpdateConstraints aufrufen, um zu beachten, dass Integritätsbedingungen aktualisiert werden müssen.

Verwandte Themen