[英]UITextField autolayout with margins programmatically
我是AutoLayout的新手,我想以100%的寬度顯示我的UITextField,左右邊距保持一致15px,如下所示:
通常,我將使用CGRect進行此操作,將寬度設置為包含視圖的寬度減去30px,然后將左側偏移15px:
searchTextField.frame = CGRectMake(15, 0, view.frame.width - 30, 50)
但是我想學習AutoLayout這類東西,因為這是最近的方式。 我應該注意,我正在以編程方式進行所有操作-這里沒有Storyboard。
如果有人可以幫助我,我會喜歡的!
更新
哇! 感謝您的所有答復。 我相信他們所有人都會實現我想做的事情,但是只能有一個:)
假設文本字段的父對象是view
,請在view.addSubview(searchTextField)
之后執行以下view.addSubview(searchTextField)
:
NSLayoutConstraint.activateConstraints([
searchTextField.leadingAnchor.constraintEqualToAnchor(view.leadingAnchor, constant: 15),
searchTextField.trailingAnchor.constraintEqualToAnchor(view.trailingAnchor, constant: -15),
])
通常,我使用這種處理約束的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)
要使用自動布局,您需要為文本字段定義約束。在這里,我創建了四個與其上級相關的約束(前導,尾隨,頂部和高度)。
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)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.