Добавлять ограничения программно быстро
Я пытаюсь добавить ограничения на кнопку входа в facebook sdk.
У меня есть кнопка внутри прокрутки, и я пытаюсь добавить верхнее ограничение на метку, которая также находится в представлении прокрутки. Я могу успешно добавить ограничение высоты без ошибок времени выполнения, но фактическое ограничение, похоже, не применяется к кнопке.
@IBOutlet weak var orLbl: UILabel!
@IBOutlet weak var scrollView: UIScrollView!
override func viewDidLoad() {
super.viewDidLoad()
var loginFBButton = FBSDKLoginButton()
loginFBButton.readPermissions = ["public_profile", "email"]
let heightConstraint = NSLayoutConstraint(
item: loginFBButton,
attribute: NSLayoutAttribute.Height,
relatedBy: NSLayoutRelation.Equal,
toItem: nil,
attribute: NSLayoutAttribute.NotAnAttribute,
multiplier: 1,
constant: 41)
let topConstraint = NSLayoutConstraint(
item: loginFBButton,
attribute: NSLayoutAttribute.TopMargin,
relatedBy: NSLayoutRelation.Equal,
toItem: self.orLbl,
attribute: NSLayoutAttribute.BottomMargin,
multiplier: 1,
constant: 31)
let leadingConstraint = NSLayoutConstraint(
item: loginFBButton,
attribute: NSLayoutAttribute.Leading,
relatedBy: NSLayoutRelation.Equal,
toItem: self.registerButton,
attribute: NSLayoutAttribute.Left,
multiplier: 1,
constant: 0)
let trailingConstraint = NSLayoutConstraint(
item: loginFBButton,
attribute: NSLayoutAttribute.Leading,
relatedBy: NSLayoutRelation.Equal,
toItem: self.registerButton,
attribute: NSLayoutAttribute.Right,
multiplier: 1,
constant: 0)
self.scrollView.addSubview(loginFBButton)
//loginFBButton.center = self.scrollView.center
loginFBButton.addConstraints([heightConstraint, topConstraint])
}
Затем, когда я включаю добавление верхнего ограничения, я получаю ошибку времени выполнения:
При добавлении в представление элементы ограничения должны быть потомками этого представления (или самого представления). Это приведет к сбою, если ограничение должно быть разрешено до того, как будет собрана иерархия представления.
Завершение приложения из-за неперехваченного исключения "NSGenericException", причина: "Невозможно установить ограничение на просмотр. Сдерживает ли ссылка что-то извне поддерева представления? Это незаконно.
И ярлык, и кнопка facebook находятся в моем представлении прокрутки? Я даже распечатал orLbl.superview и loginFBButton.superview, и я получаю дополнительное uiscrollview для обоих
Ответы
Ответ 1
Существует новый (iOS8, OS 10.10), более простой способ активировать ограничения, которые не связаны с выяснением, к каким представлениям их добавить. Ограничения уже знают, с какими представлениями они принадлежат, поэтому сначала убедитесь, что ваши представления добавлены как подвид, а затем вызовите метод класса activateConstraints
on NSLayoutConstraint
, чтобы активировать их:
NSLayoutConstraint.activateConstraints([heightConstraint, topConstraint])
Когда вы создаете элементы пользовательского интерфейса программно, вам нужно сказать iOS, чтобы он не превратил свой фрейм в ограничения. Для этого сразу после создания loginFBButton
do:
Для Swift 1.2:
loginFBButton.setTranslatesAutoresizingMaskIntoConstraints(false)
Для Swift 2.0 и 3.0:
loginFBButton.translatesAutoresizingMaskIntoConstraints = false
Наконец, вам понадобятся дополнительные ограничения. Я предлагаю установить ограничение ширины для loginFBButton
и добавить ограничение для позиционирования кнопки по горизонтали.