2015-11-08 13 views
6

Ich verwende storyboard und autolayout, und die Einschränkungen in IB als IBOutlet in der entsprechenden Ansicht Controller festlegen. Ich lese einige Beiträge darüber, wie die Einschränkungen zu aktualisieren Porträt, anders zu sein in und in der Landschaft, aber ich bin noch nicht sicher, wie soll ich dies tun:Korrekte Methode zum programmatischen Aktualisieren von Integritätsbedingungen bei Änderungen der Geräteausrichtung?

  1. Soll ich die neuen Einschränkungen in -viewWillTransitionToSize:withTransitionCoordinator: Verfahren eingestellt, oder in updateViewConstraints Methode?
  2. Wenn die neuen Einschränkungen festgelegt sind, sollte ich [self.view setNeedsUpdateConstraints]; oder layoutIfNeeded oder setNeedsLayout aufrufen?
  3. Wie soll ich aktualisieren, zum Beispiel die Konstante einer gewissen Einschränkung:

    self.myConstraint.constant = 30.0

oder tun:

[self.view removeConstraint:self.passwordViewHeight]; 

self.passwordViewHeight = [NSLayoutConstraint constraintWithItem:self.passwordView 
                 attribute:NSLayoutAttributeHeight 
                 relatedBy:NSLayoutRelationEqual 
                 toItem:nil 
                 attribute:NSLayoutAttributeNotAnAttribute 
                multiplier:1.0 
                 constant:34.0]; 

[self.view addConstraint:self.passwordViewHeight]; 

Vielen Dank im Voraus

Antwort

0

Die beste So wäre es möglich, die Konstante zu ändern, anstatt die Einschränkung und die Wiederherstellung zu entfernen ng es wieder. Einfaches Addieren oder Subtrahieren von der Konstante ist auf lange Sicht viel schneller. Was würden Sie tun möchten, ist so etwas wie:

[self.view layoutIfNeeded]; 
self.myConstraint.constant = 30.0; 
[self.view layoutIfNeeded]; 

Es wird empfohlen, vor layoutIfNeeded anrufen und nachdem Sie die Konstante als auch ändern. Dies liegt daran, dass Sie möglicherweise eine Einschränkung haben, die noch nicht durchgeführt wurde, und dies tun werden, bevor Sie weitere Einschränkungen ändern.

+0

Vielen Dank. Von welcher Methode soll ich das nennen? – AppsDev

+0

Sie können Ihre eigene Methode erstellen, von der aus Sie anrufen, wenn Sie eine Benachrichtigung für die Änderung der Geräteausrichtung eingerichtet haben, rufen Sie sie von dieser Methode auf. Wenn Sie das nicht eingerichtet haben, werden Sie dies auf jeden Fall mit dem folgenden Code tun wollen: '[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector (yourMethodHere) name: UIDeviceOrientationDidChangeNotification Objekt: nil];' – Tyler

+0

Wäre '' viewWillTransitionToSize' Methode auch ein guter Ort? – AppsDev

0

Die beste Idee wird Verwendung Size Classes in Interface Builder Authorotation Änderung zu erreichen.

https://www.codefellows.org/blog/size-classes-with-xcode-6-one-storyboard-for-all-sizes

+0

Danke. Ich muss iOS 7 und höher für iPhone-Geräte unterstützen und ich habe bereits ein "Storyboard" mit nur aktiviertem "Auto-Layout". Ich habe ungefähr 32 Szenen in diesem Storyboard ... Ist es wert, zu diesem Zeitpunkt in die Größenklassen zu wechseln und zu berücksichtigen, dass ich iOS 7 unterstützen muss? – AppsDev

1

Orientierungsänderung unter Verwendung des Verfahrens viewWillTransitionToSize detektiert werden. Diese Methode wird aufgerufen, wenn sich die Ausrichtung des Geräts ändert.

-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator (id<UIViewControllerTransitionCoordinator>)coordinator{ 
     //change constraints 
} 

Alternativ, wenn Sie die Einschränkungen nach den Orientierungsänderungen ändern möchten, verwenden Sie die animateAlongsideTransition Methode des Koordinators Objekt in der viewWillTransitionToSize Methode.

-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator{ 
    [coordinator animateAlongsideTransition:nil completion:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) { 
     //change constraints 
    }]; 
}