以编程方式添加带有约束的 UITextField

Posted

技术标签:

【中文标题】以编程方式添加带有约束的 UITextField【英文标题】:Add UITextField with constraints programmatically 【发布时间】:2016-02-18 21:00:54 【问题描述】:

在我的应用程序中,我想通过单击按钮添加一个或多个 UITextField。我可以在自定义 UIView(在 Storyboard 中预定义)中创建 UITextFields,但我无法正确地将约束添加到文本字段和 UIView 对 Button 的约束(按钮位于 UIView 下方)。因此,每次单击按钮时,我都想使用给定的约束调整 UIView 的大小,并在添加文本字段后向下移动按钮。现在我正在使用此代码,它成功添加了文本字段,但约束不起作用:

@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])


【问题讨论】:

为什么不使用 TableView ? 【参考方案1】:

正如 UlyssesR 所说,您可以使用 tableView 并轻松处理插入操作。

但是,如果您希望它以这种方式工作,那么首先,您没有指定足够的约束来保持视图的位置。

基本上,分配底部约束只会识别视图的 y 位置。所以没有关于 x 位置、宽度或高度等的指示。

为了使其工作,您必须提供足够的约束。每个视图可能大约 4 个。这实际上取决于约束和要求。

因此,在您的情况下,您可以添加widthheightcenterX 约束来保存视图。

每当您尝试以编程方式设置约束时,请不要忘记为每个应用了约束的视图将translatesAutoresizingMaskIntoConstraints 设置为false。如果约束不影响父视图,则不要设置为父视图。

另外,如果您是 AutoLayouts 的新手,我真的建议您通过 Apple's documentation for autolayouts

RayWenderLich有自动布局教程。

【讨论】:

以上是关于以编程方式添加带有约束的 UITextField的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将约束添加到相对于同级的视图

以编程方式添加具有相对约束问题的标签

未能尝试在 SWIFT 中以编程方式在滚动视图中添加 UIView 约束

iOS:以编程方式添加约束获取视图高度作为唯一指标

以编程方式构建带有约束的titleView(或通常构建带有约束的视图)

如何以编程方式创建带有约束的视图