Обновление Frame / Constraints для программно добавленного UIView при изменении ориентации - PullRequest
0 голосов
/ 05 июня 2018

У меня есть UIView, который я добавляю программно со следующим кодом в viewDidLoad

dropMenuView = YNDropDownMenu(frame: CGRect(x: 0.0, y: 0, width: UIScreen.main.bounds.width, height: 40.0), dropDownViews: [typeView, brandView, priceView], dropDownViewTitles:["Type", "Brand", "Price"])
self.view.addSubview(dropMenuView)

Приведенный выше код создает представление с правильной шириной для текущей ориентации, но если пользователь изменяетих ориентация устройства, ширина обзора не обновляется.Я попытался добавить новое ограничение в viewWillTransitionTo:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    let widthConstraint = NSLayoutConstraint(item: dropMenuView, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 100)

    dropMenuView.addConstraints([widthConstraint])
    dropMenuView.layoutIfNeeded()
}

Я пробовал несколько мутаций в приведенном выше коде, пытаясь заставить его работать.Обычно я получаю сообщение об ошибке: «NSLayoutConstraint для>: неизвестный атрибут макета»

Я не могу не думать, что поступаю неправильно.Меняет ли путь добавление новых ограничений на ориентацию?Я попытался просто добавить ограничение равной ширины после добавления подпредставления, но я получаю ту же ошибку.Я никогда раньше не добавлял ограничений программно, поэтому для меня это неизведанные воды.Каков будет лучший подход здесь?

1 Ответ

0 голосов
/ 05 июня 2018

Добавление ограничений во время изменения ориентации не очень хорошая идея.Если бы вы сделали это, вам бы пришлось удалить ранее добавленные ограничения, чтобы избежать чрезмерного ограничения вашего представления.

Ограничение, которое вы пытаетесь создать, не является правильным.Вы используете .notAnAttrubute только когда передаете nil в качестве второго вида.

Я предлагаю вместо этого использовать привязки макета.Их легче писать и читать:

dropMenuView = YNDropDownMenu(frame: CGRect.zero, dropDownViews: [typeView, brandView, priceView], dropDownViewTitles:["Type", "Brand", "Price"])
self.view.addSubview(dropMenuView)

// you need to set this if you are adding your own constraints and once
// yet set it, the frame is ignored (which is why we just passed CGRect.zero
// when creating the view)
dropMenuView.translatesAutoresizingMaskIntoConstraints = false

// Create the constraints and activate them.  This will set `isActive = true`
// for all of the constraints.  iOS knows which views to add them to, so
// you don't have to worry about that detail  
NSLayoutConstraint.activate([
    dropMenuView.topAnchor.constraint(equalTo: view.topAnchor),
    dropMenuView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
    dropMenuView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
    dropMenuView.heightAnchor.constraint(equalToConstant: 40)
])
...