2015-11-08 47 views
6

Używam storyboard i autolayout, i ustawienie ograniczeń w IB jako IBOutlet w odpowiednim kontroler widoku. Czytam kilka postów dotyczących sposobu aktualizacji ograniczeń być różne w portret i krajobraz, ale wciąż nie jestem pewien, w jaki sposób należy zrobić to:Prawidłowy sposób programowej aktualizacji wiązań po zmianie orientacji urządzenia?

  1. powinienem ustawić nowe ograniczenia w -viewWillTransitionToSize:withTransitionCoordinator: metodzie lub w metodzie updateViewConstraints?
  2. Kiedy nowe więzy są ustawione, czy powinienem zadzwonić pod numer [self.view setNeedsUpdateConstraints]; lub layoutIfNeeded lub setNeedsLayout?
  3. jaki sposób należy aktualizować, na przykład, stały z pewnym ograniczeniem:

    self.myConstraint.constant = 30.0

czyli:

[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]; 

góry dziękuję

Odpowiedz

0

Najlepszym sposobem byłoby zmienić stałą zamiast usuwania ograniczenia i recreati Znowu to. Dodanie lub odjęcie od stałej jest również znacznie szybsze w dłuższej perspektywie. Co byś chciał zrobić coś takiego jak:

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

Zaleca się nazywasz layoutIfNeeded przed i po zmianie stałej, jak również. Dzieje się tak dlatego, że możesz mieć pewne ograniczenia, które jeszcze nie zostały wykonane i zrobisz to, zanim zmienisz więcej więzów.

+0

Dziękuję. Z jakiej metody mam to nazwać? – AppsDev

+0

Możesz stworzyć własną metodę wywołania tego, jeśli skonfigurowałeś powiadomienie o zmianie orientacji urządzenia, wywołaj ją z tej metody. Jeśli tego nie ustawiłeś, na pewno będziesz chciał to zrobić za pomocą następującego kodu: '[[NSNotificationCenter defaultCenter] addObserver: selektor własny: @selector (yourMethodHere) name: UIDeviceOrientationDidChangeNotification object: nil];' – Tyler

+0

Będzie " metoda viewWillTransitionToSize' również dobre miejsce? – AppsDev

0

Najlepszym pomysłem będzie użycie Size Classes w Kreatorze interfejsów, aby uzyskać zmianę autorotacji.

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

+0

Dzięki. Muszę obsługiwać system iOS 7 lub nowszy dla urządzeń iPhone i mam już "storyboard" z włączonym tylko 'autolayout'. Mam około 32 scen w tym scenariuszu ... Czy warto w tym momencie przenieść się na klasy wielkości i biorąc pod uwagę, że muszę obsługiwać iOS 7? – AppsDev

1

zmiany orientacji można wykrywać za pomocą metody viewWillTransitionToSize. Ta metoda zostanie wywołana, gdy orientacja urządzenia wkrótce się zmieni.

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

Ewentualnie, jeśli chcesz zmienić ograniczenia po zmianach orientacji, należy użyć metody animateAlongsideTransition obiektu koordynator w sposobie viewWillTransitionToSize.

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