2015-07-07 2 views
13

Я пытаюсь добавить ограничения на кнопку входа в facebook sdk.add constraints programatically swift

У меня есть кнопка внутри прокрутки, и я пытаюсь добавить верхнее ограничение на метку, которая также находится в представлении прокрутки. Я могу успешно добавить ограничение по высоте без ошибок времени выполнения, но фактическое ограничение, похоже, не применяется к кнопке.

@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 для обоих

+0

Вы пытались выяснить, какое из двух ограничений вызывает исключение? – freytag

+0

@freytag да, как упоминалось в вопросе, именно тогда, когда я добавил верхнее ограничение, произошел сбой. Другой пользователь предложил добавить ограничения в scrollview вместо loginFBButton. Я сделал это и не получил ошибок во время выполнения, но тогда моя кнопка facebook находится в верхнем левом углу экрана, а ярлык полностью не отображается. – user2363025

ответ

28

Существует новый (iOS8, OS 10.10), более простой способ активировать ограничения, которые не связаны с выяснением, какие виды чтобы добавить их. Ограничения уже знают, рассматривающей они принадлежат, поэтому сначала убедитесь, что ваши взгляды были добавлены в подпанелей, а затем вызвать метод класса activateConstraints на NSLayoutConstraint, чтобы активировать их:

NSLayoutConstraint.activateConstraints([heightConstraint, topConstraint]) 

При создании элементов пользовательского интерфейса программно, вам нужно чтобы iOS не превращать его фрейм в ограничения. Чтобы сделать это, только после создания loginFBButton сделать:

Для Swift 1.2:

loginFBButton.setTranslatesAutoresizingMaskIntoConstraints(false) 

Для Swift 2,0 & 3,0:

loginFBButton.translatesAutoresizingMaskIntoConstraints = false 

Наконец, вы будете нуждаться в более ограничения. Я предлагаю установить ограничение ширины для вашего loginFBButton и добавить ограничение для позиционирования кнопки по горизонтали.

+0

Я обновил код, чтобы включить все ограничения, которые я использовал. Итак, в этот момент я все еще добавляю ограничения, а затем устанавливаю translateAutoresizingMaskIntoConstraints bool или что такое поток? – user2363025

+0

Создайте свою кнопку, установите для translatesAutoresizingMaskIntoConstraints значение false, добавьте свою кнопку в scrollView, создайте ограничения и активируйте их. – vacawama

+0

спасибо Я получил его для работы с использованием, loginFBButton.setTranslatesAutoresizingMaskIntoConstraints (false). Я также должен был добавить ограничения в представление прокрутки, а не в loginFBButton. Мне не нужно было использовать ограничения активации, но – user2363025