2016-02-01 3 views
2

Я заметил, что когда я программно обновляю свои ограничения автоопределения, все изменения возвращаются, когда я поворачиваю экран.Сохранение ограничений автоматического отключения при повороте устройства

Воспроизведите проблему:

  • Базовый интерфейс раскадровки с UIView и 2 ограничений:

    1. ширина равна superview.width (множитель 1) активное
    2. ширина равна superview.width (умножитель 1/2) отключено
  • Создайте и свяжите ese 2 с IBOutlet

  • Программно отключить первое ограничение и включить второй.
  • Поверните устройство, первое ограничение активировано, а второе отключено.

Кажется, это ошибка.

Как вы думаете?

Скриншоты:

Раскадровка: enter image description here

Constraint # 1:

enter image description here

Constraint # 2:

enter image description here

+0

Вы используете раскадровку? Это похоже на поведение классов. – kedzia

+0

Да, я использую раскадровку, но ограничения включены для всех классов размеров. У меня нет какой-либо конкретной конфигурации размера. – Salah

+0

Я бы постарался установить их так, как вы хотите, чтобы они были для повернутого класса размера – kedzia

ответ

5

Размер Классы

Установленная относится к установке размера классов, не активного/неактивными.

Вы должны создать другое ограничение программно и активировать/деактивировать , что. Это связано с тем, что вы не можете изменить множитель ограничения (Can i change multiplier property for NSLayoutConstraint?), и вы не можете возиться с классами размера (activateConstraints: and deactivateConstraints: not persisting after rotation for constraints created in IB).

Существует несколько способов сделать это. В приведенном ниже примере я создаю копию вашего ограничения x1 с умножителем или 1/2. Затем я переключаться между ними:

@IBOutlet var fullWidthConstraint: NSLayoutConstraint! 
var halfWidthConstraint: NSLayoutConstraint! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    halfWidthConstraint = NSLayoutConstraint(item: fullWidthConstraint.firstItem, 
     attribute: fullWidthConstraint.firstAttribute, 
     relatedBy: fullWidthConstraint.relation, 
     toItem: fullWidthConstraint.secondItem, 
     attribute: fullWidthConstraint.secondAttribute, 
     multiplier: 0.5, 
     constant: fullWidthConstraint.constant) 
    halfWidthConstraint.priority = fullWidthConstraint.priority 
} 

@IBAction func changeConstraintAction(sender: UISwitch) { 
    if sender.on { 
     NSLayoutConstraint.deactivateConstraints([fullWidthConstraint]) 
     NSLayoutConstraint.activateConstraints([halfWidthConstraint]) 
    } else { 
     NSLayoutConstraint.deactivateConstraints([halfWidthConstraint]) 
     NSLayoutConstraint.activateConstraints([fullWidthConstraint]) 
    } 
} 

Проверено на прошивкой 9+, Xcode 7+.

+0

Спасибо, я не знал, что «установлен» предназначен только для классов размеров. Просто, чтобы быть ясным, когда я создаю ограничение программным способом, он по умолчанию назначается для всех классов размера? – Salah

+1

Программно созданные ограничения применяются ко всем классам классов. Включение/отключение их требует дополнительных усилий: http://stackoverflow.com/a/27289658/218152 – SwiftArchitect

0

Вы можете сделать необходимый переключатель с ограничениями, созданными через IB для классов классов.Хитрость заключается в том, чтобы сохранить свернутое состояние в переменных и ограничениях обновления, как на событии вашей кнопки, так и на событии изменения коллекции признаков.

var collapsed: Bool { 
    didSet { 
     view.setNeedsUpdateConstraints() 
    } 
} 

@IBAction func onButtonClick(sender: UISwitch) { 
    view.layoutIfNeeded() 
    collapsed = !collapsed   
    UIView.animate(withDuration: 0.3) { 
     view.layoutIfNeeded() 
    } 
} 

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { 
    super.traitCollectionDidChange(previousTraitCollection) 
    view.setNeedsUpdateConstraints() 
} 

override func updateViewConstraints() { 
    constraint1.isActive = !collapsed 
    constraint2.isActive = collapsed 
    super.updateViewConstraints() 
} 
Смежные вопросы