Tak, można to zrobić z ograniczeniami.
Najpierw należy utworzyć wiązania do podglądu, a nie do najbliższego widoku. Sąsiadujące widoki będą zmieniać pozycje, więc NIE chcemy, aby ograniczenia były względne względem innych widoków. Zobacz poniższy zrzut ekranu, aby dowiedzieć się, jak ustawić ograniczenia.
Następnie odwołuje ograniczeń będziesz modyfikujących do IBOutlets więc możemy modyfikować je programowo. Na swoim przykładzie, byłyby one ograniczenia:
@IBOutlet var greenViewTrailingConstraint: NSLayoutConstraint!
@IBOutlet var greenViewBottomConstraint: NSLayoutConstraint!
@IBOutlet var redViewTopConstraint: NSLayoutConstraint!
@IBOutlet var redViewLeadingConstraint: NSLayoutConstraint!
@IBOutlet var redViewBottomConstraint: NSLayoutConstraint!
@IBOutlet var blueViewTrailingConstraint: NSLayoutConstraint!
@IBOutlet var blueViewTopConstraint: NSLayoutConstraint!
@IBOutlet var blueViewLeadingConstraint: NSLayoutConstraint!
Wreszcie, zaktualizuj stałych więzów opartych na UIInterfaceOrientation. Ponownie, za pomocą przykładu, kod wygląda mniej więcej tak:
override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
let padding: CGFloat = 16.0
// since we're calling this before the rotation, the height and width are swapped
let viewHeight = self.view.frame.size.width
let viewWidth = self.view.frame.size.height
// if landscape
if UIInterfaceOrientationIsLandscape(toInterfaceOrientation) {
greenViewTrailingConstraint.constant = (viewWidth/2.0) + (padding/2.0)
greenViewBottomConstraint.constant = padding
blueViewTopConstraint.constant = (viewHeight/2.0) + (padding/2.0)
blueViewTrailingConstraint.constant = padding
blueViewLeadingConstraint.constant = (viewWidth/2.0) + (padding/2.0)
redViewTopConstraint.constant = padding
redViewBottomConstraint.constant = (viewHeight/2.0) + (padding/2.0)
redViewLeadingConstraint.constant = (viewWidth/2.0) + (padding/2.0)
} else { // else portrait
greenViewBottomConstraint.constant = (viewHeight/2.0) + (padding/2.0)
greenViewTrailingConstraint.constant = padding
blueViewTopConstraint.constant = (viewHeight/2.0) + (padding/2.0)
blueViewTrailingConstraint.constant = (viewWidth/2.0) + (padding/2.0)
blueViewLeadingConstraint.constant = padding
redViewLeadingConstraint.constant = (viewWidth/2.0) + (padding/2.0)
redViewBottomConstraint.constant = padding
redViewTopConstraint.constant = (viewHeight/2.0) + (padding/2.0)
}
}
Nicea rozwiązanie! ! Ale właśnie zastanawiałem się, czy dobrze jest dodawać i usuwać ograniczenia programowo podczas obrotu urządzenia. –
@RashmiRanjanmallick, Dobre pytanie! Jednak nie dodajemy/usuwamy ograniczeń. Po prostu modyfikujemy ich stałe. Modyfikowanie stałych ograniczeń jest powszechną praktyką, szczególnie w animacji UIView lub rotacji urządzenia. –
Dzięki, po prostu zastanawiam się, dlaczego na Ziemi nie stworzyli scenariusza, jak wybrać tryb portretu i ustawić układ pionowy, a następnie wybierz tryb krajobrazu i skonfigurować układ krajobrazu. – fullMoon