Ios UITextField以编程方式自动布局带边距

Ios UITextField以编程方式自动布局带边距,ios,swift,autolayout,uitextfield,cgrect,Ios,Swift,Autolayout,Uitextfield,Cgrect,我是AutoLayout新手,希望以100%的宽度显示UITextField,左右边距保持一致,如下所示: 通常,我会使用CGRect来实现这一点,将宽度设置为包含视图的宽度减去30px,然后将左侧偏移15px: searchTextField.frame = CGRectMake(15, 0, view.frame.width - 30, 50) 但我想学习自动布局这类东西,因为它的方式去这些天。我应该注意到,我以编程的方式做每件事——这里没有故事板 如果有人能帮我,我会很高兴的 更新 哇

我是AutoLayout新手,希望以100%的宽度显示UITextField,左右边距保持一致,如下所示:

通常,我会使用CGRect来实现这一点,将宽度设置为包含视图的宽度减去30px,然后将左侧偏移15px:

searchTextField.frame = CGRectMake(15, 0, view.frame.width - 30, 50)
但我想学习自动布局这类东西,因为它的方式去这些天。我应该注意到,我以编程的方式做每件事——这里没有故事板

如果有人能帮我,我会很高兴的

更新


哇!谢谢你的回复。我相信他们都能达到我想要做的,但只能有一个:)

在故事板中设置约束


单击文本字段,然后单击左下角的。从这里您可以选择这样的约束。

要使用自动布局,您需要为文本字段定义约束。在这里,我创建了四个与其superview相关的约束(前导、尾随、顶部和高度)

func addLabelConstraints(superView:UIView) {

    let leading = NSLayoutConstraint(item: searchTextField, attribute: .Leading, relatedBy: .Equal, toItem: superView, attribute: .Leading, multiplier: 1, constant: 15)
    superview!.addConstraint(leading)

    let trailing = NSLayoutConstraint(item: searchTextField, attribute: .Trailing, relatedBy: .Equal, toItem: superView, attribute: .Trailing, multiplier: 1, constant: 15)
    superView.addConstraint(trailing)

    let top = NSLayoutConstraint(item: searchTextField, attribute: .Top, relatedBy: .Equal, toItem: superView, attribute: .Top, multiplier: 1, constant: 0)
    superView.addConstraint(top)

    let height = NSLayoutConstraint(item: searchTextField, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .Height, multiplier: 0, constant: 50)
    superView.addConstraint(height)
 }

假设文本字段的父字段是
view
,请在
view.addSubview(searchTextField)
之后执行此操作:


通常我使用cocoapod来处理约束,但如果您需要纯苹果解决方案文档说明:

在以编程方式创建时,有三种选择 约束:可以使用布局定位,也可以使用 NSLayoutConstraint类,也可以使用可视化格式语言

在您的情况下,NSLayoutConstraints的方法是:

NSLayoutConstraint(item: textField, attribute: .Leading, relatedBy: .Equal, toItem: parentView, attribute: .LeadingMargin, multiplier: 1.0, constant: 15.0).active = true

NSLayoutConstraint(item: textField, attribute: .Trailing, relatedBy: .Equal, toItem: parentView, attribute: .TrailingMargin, multiplier: 1.0, constant: -15.0).active = true

NSLayoutConstraint(item: textField, attribute: .Top, relatedBy: .Equal, toItem: parentView, attribute: .TopMargin, multiplier: 1.0, constant: 50.0).active = true
请记住,如果视图中没有任何约束,它们将自动添加,并且您必须处理它们以及通过在运行时添加新约束而创建的冲突。为了避免这种情况,您可以手动创建textField并将其添加到视图中,或者在Interface Builder中设置优先级较低的约束。

使用以下代码:

let topConstraint = NSLayoutConstraint(item: textField, attribute: NSLayoutAttribute.Top, relatedBy: .Equal, toItem: self.view, attribute: NSLayoutAttribute.Top, multiplier: 1.0, constant: 0)

let trailingConstraint  = NSLayoutConstraint(item: textField, attribute: NSLayoutAttribute.Trailing, relatedBy: .Equal, toItem: self.view, attribute: NSLayoutAttribute.Trailing, multiplier: 1.0, constant: 15)

let leadingConstraint = NSLayoutConstraint(item: textField, attribute: NSLayoutAttribute.Leading, relatedBy: .Equal, toItem: self.view, attribute: NSLayoutAttribute.Leading, multiplier: 1.0, constant: 15)

let heightConstraint = NSLayoutConstraint(item: textField, attribute: NSLayoutAttribute.Height, relatedBy: .Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1.0, constant: 50)

self.view.addConstraint(topConstraint )
self.view.addConstraint(trailingConstraint)
self.view.addConstraint(leadingConstraint)
self.view.addConstraint(heightConstraint)

我的错——我应该详细说明我是在不使用故事板的情况下尝试这样做的。到目前为止,一切都是通过代码完成的。这当然不是“要走的路”。但是,如果必须用代码完成,然后,您需要创建
NSLayoutConstraint
对象,并将这些对象添加到父视图中(如果它们处理视图之间的间距),或者添加到指定高度或宽度的文本字段本身。我喜欢
activateConstraints:
let topConstraint = NSLayoutConstraint(item: textField, attribute: NSLayoutAttribute.Top, relatedBy: .Equal, toItem: self.view, attribute: NSLayoutAttribute.Top, multiplier: 1.0, constant: 0)

let trailingConstraint  = NSLayoutConstraint(item: textField, attribute: NSLayoutAttribute.Trailing, relatedBy: .Equal, toItem: self.view, attribute: NSLayoutAttribute.Trailing, multiplier: 1.0, constant: 15)

let leadingConstraint = NSLayoutConstraint(item: textField, attribute: NSLayoutAttribute.Leading, relatedBy: .Equal, toItem: self.view, attribute: NSLayoutAttribute.Leading, multiplier: 1.0, constant: 15)

let heightConstraint = NSLayoutConstraint(item: textField, attribute: NSLayoutAttribute.Height, relatedBy: .Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1.0, constant: 50)

self.view.addConstraint(topConstraint )
self.view.addConstraint(trailingConstraint)
self.view.addConstraint(leadingConstraint)
self.view.addConstraint(heightConstraint)