Подтвердить что ты не робот

Добавлять ограничения программно быстро

Я пытаюсь добавить ограничения на кнопку входа в 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 для обоих

4b9b3361

Ответ 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 и добавить ограничение для позиционирования кнопки по горизонтали.