Да, вы можете сделать это с ограничениями.
Во-первых, вам нужно создать ограничения для супервизора, а не для ближайшего вида. Соседние представления будут меняться, поэтому мы НЕ хотим, чтобы ограничения относились к другим представлениям. См. Скриншот ниже для примера того, как установить ограничения.
Далее связать ограничения, которые вы будете модифицирующие к IBOutlets поэтому мы можем изменить их программно. Для примера, это будут ограничения:
@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!
Наконец, обновление констант ограничений, основанных на UIInterfaceOrientation. Опять же, используя ваш пример, код выглядит примерно так:
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)
}
}
Nice решение! ! Но мне было просто интересно, полезно ли добавлять и удалять ограничения программно во время вращения устройства. –
@RashmiRanjanmallick, Хороший вопрос! Однако мы не добавляем/удаляем ограничения. Мы просто модифицируем их константы. Изменение констант ограничения является обычной практикой, особенно в анимации UIView или вращении устройства. –
Спасибо, я просто удивляюсь, почему на земле они не делали раскадровку, как выбирать портретный режим, а также настраивали портретную макет, а также выбирали ландшафтный режим и настраивали ландшафтный макет. – fullMoon