以编程方式添加约束 swift
add constraints programmatically swift
我正在尝试向 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
有一种新的(iOS8、OS 10.10)更简单的激活约束的方法,不需要确定将它们添加到哪些视图。约束已经知道它们属于哪些视图,所以首先确保您的视图已添加为子视图,然后在 NSLayoutConstraint
上调用 class 方法 activateConstraints
来激活它们:
NSLayoutConstraint.activateConstraints([heightConstraint, topConstraint])
当您以编程方式创建 UI 元素时,您需要告诉 iOS 不要将其框架变成约束。为此,在创建 loginFBButton
之后执行:
对于Swift 1.2:
loginFBButton.setTranslatesAutoresizingMaskIntoConstraints(false)
对于 Swift 2.0 和 3.0:
loginFBButton.translatesAutoresizingMaskIntoConstraints = false
最后,您将需要更多约束。我建议为您的 loginFBButton
设置一个宽度约束并添加一个约束来水平放置按钮。
我正在尝试向 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有一种新的(iOS8、OS 10.10)更简单的激活约束的方法,不需要确定将它们添加到哪些视图。约束已经知道它们属于哪些视图,所以首先确保您的视图已添加为子视图,然后在 NSLayoutConstraint
上调用 class 方法 activateConstraints
来激活它们:
NSLayoutConstraint.activateConstraints([heightConstraint, topConstraint])
当您以编程方式创建 UI 元素时,您需要告诉 iOS 不要将其框架变成约束。为此,在创建 loginFBButton
之后执行:
对于Swift 1.2:
loginFBButton.setTranslatesAutoresizingMaskIntoConstraints(false)
对于 Swift 2.0 和 3.0:
loginFBButton.translatesAutoresizingMaskIntoConstraints = false
最后,您将需要更多约束。我建议为您的 loginFBButton
设置一个宽度约束并添加一个约束来水平放置按钮。