2016-02-18 58 views
0

在我的應用程序中,我想添加一個或多個UITextFields並點擊按鈕。我可以在自定義UIView(在Storyboard中預定義)中創建UITextFields,但是我無法正確地將約束添加到UIView的按鈕(按鈕位於UIView下)的文本字段和約束中。所以每按一下按鈕,我想調整UIView的大小,並在添加文本字段後按下按鈕。現在我使用此代碼,它增加了文本字段成功,但約束不工作:添加帶約束的UITextField programmaticaly

@IBAction func addCustomTextField(sender: AnyObject) { 

    let x : CGFloat = 20 
    var y : CGFloat = 10 
    let width : CGFloat = 300 
    let height : CGFloat = 40 


    var lastButtonY : Int? = NSUserDefaults.standardUserDefaults().integerForKey("lastButtonY") 

    if lastButtonY > 0 { 
     y = CGFloat.init(lastButtonY! + 8) 
     NSUserDefaults.standardUserDefaults().setObject(y + height, forKey: "lastButtonY") 
    } else { 
     NSUserDefaults.standardUserDefaults().setObject(10 + height, forKey: "lastButtonY") 
    } 

    sampleTextField = UITextField(frame: CGRectMake(x, y, width, height)) 
    sampleTextField.placeholder = "Enter text here" 
    sampleTextField.font = UIFont.systemFontOfSize(15) 
    sampleTextField.borderStyle = UITextBorderStyle.RoundedRect 
    sampleTextField.autocorrectionType = UITextAutocorrectionType.No 
    sampleTextField.keyboardType = UIKeyboardType.Default 
    sampleTextField.returnKeyType = UIReturnKeyType.Done 
    sampleTextField.clearButtonMode = UITextFieldViewMode.WhileEditing; 
    sampleTextField.contentVerticalAlignment = UIControlContentVerticalAlignment.Center 
    self.customView.addSubview(sampleTextField) 

    let bottomConstraintForTextField = NSLayoutConstraint(item: sampleTextField, attribute: .Bottom, relatedBy: .Equal, toItem: customView, attribute: .Bottom, multiplier: 1, constant: 10) 

    let bottomConstraintForCustomView = NSLayoutConstraint(item: customView, attribute: .Bottom, relatedBy: .Equal, toItem: addButton, attribute: .Bottom, multiplier: 1, constant: 10) 

    NSLayoutConstraint.activateConstraints([bottomConstraintForTextField, bottomConstraintForCustomView]) 

} 
+0

爲什麼不使用TableView? – UlyssesR

回答

0

正如UlyssesR提到的,你可以利用tableView和方便地處理插入。

但是,如果你希望它以這種方式工作,那麼首先,你沒有指定足夠的約束來保持視圖的位置。

基本上,分配一個底部約束只會標識視圖的y位置。所以沒有跡象表明x的位置,寬度或高度等。

爲了它的工作,你必須提供足夠的約束。每個視圖可能有4個左右。這真的取決於約束和要求。

所以在你的情況下,你可以添加width,heightcenterX約束來保存視圖。

只要您嘗試以編程方式設置約束,請不要忘記將translatesAutoresizingMaskIntoConstraints設置爲false,以應用約束的每個視圖。如果約束不影響父視圖,則不要設置爲父視圖。

此外,如果你是新的自動版式,我真的建議你去通過Apple's documentation for autolayouts

有教程在RayWenderLich自動版式。