首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用自动布局管理UITextField的动态位置

使用自动布局管理UITextField的动态位置
EN

Stack Overflow用户
提问于 2015-09-11 06:38:15
回答 2查看 950关注 0票数 2

我的当事人的要求如下:

我将用大约15 textFields创建注册表单(在服务器上预定义)。注册字段中的字段信息来自服务器。在某些情况下,可能不需要某些字段。因此,我将得到该特殊情况所需的字段。

假设没有。服务器上的预定义字段为15。即FirstName、LastName、电话号码、出生日期、图片、电子邮件、地址、邮政编码等。

但在某些情况下,可能不需要电子邮件id字段。所以我不会从服务器上得到那个字段。因此,应用程序端我必须隐藏电子邮件文本框,使其不受预定义字段列表的影响。

此外,也有可能不需要多个字段(任何字段)。所以我也得把它们藏起来。我试图通过图像表示来解释情况如下。

案例1:

案例2:

在本例中,我所做的是(应用程序端)为所有预定义字段创建textFields。然后我隐藏了textfield,这是服务器响应所不需要的。即电子邮件、文本字段或任何其他textfield。

现在我的问题是,如果不需要任何字段,那么应该重新定位textfields,并且在我的应用程序中使用自动布局。我正在隐藏电子邮件文本框,那么如何设置下一个文本框的位置,如联系人号、出生日期等?

EN

回答 2

Stack Overflow用户

发布于 2015-09-11 07:02:58

是的,这是完全可能的自动布局。

这里最重要的是:

您不需要手动重新定位它,此工作将由自动布局完成。

你必须做以下事情:

  1. 使用UIScrollView并在其中添加所有UITextField。这样,内容大小和变化的位置将很容易管理。在这里,scrollView的内容大小也是由自动布局管理的,所以不要手动进行。
  2. 不要手动为UITextField分配帧。例如,在创建CGRect时使用textField。
  3. 使用VFL (视觉格式化语言)。这是一种功能强大的自动布局语言,可以让您使用代码在运行时进行动态更改。
  4. 为所有UITextFields添加约束,并最初将hidden属性设置为No/False。从服务器响应和查询中,只需调用下面的方法,就可以使它们可见并更新自动布局约束。 //根据您的响应/.更改隐藏属性/.//下面的方法将更新自动布局textField layoutIfNeeded;self.view layoutIfNeeded; 您可以将这些方法放在动画块中,以获得充分的UI体验。

注意:记住VFL不是一个容易的部分,当你使用它的时候你必须小心。

添加示例代码可以帮助您(但它是在Swift中转换它在目标C中),而且VFL的参数和值也可能有变化,因为这段代码符合我的要求。看一看,并根据你的需要改变它。

使用VFL:UIScrollView创建

代码语言:javascript
复制
// Create scrollview to display content
self.scrollView = UIScrollView()
self.scrollView.delegate = self
self.scrollView.setTranslatesAutoresizingMaskIntoConstraints(false)
self.view.addSubview(self.scrollView)

// Visual formatting constraints of scrollview horizontal-vertical alignment with respect to view
self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[scrollView]|", options: NSLayoutFormatOptions(0), metrics: nil, views: ["scrollView" : scrollView]))

self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[scrollView]|", options: NSLayoutFormatOptions(0), metrics: nil, views: ["scrollView" : scrollView]))

UITextField UIScrollView**:**中的添加

代码语言:javascript
复制
func createRegistrationControls() {
    var previousTextField : UITextField! = nil

    // Remove all pervious views.
    for view in self.scrollView.subviews {
        view.removeFromSuperview()
    }

    for <YOUR NO OF TEXTFIELDS CONDITION> {
        let textField : UITextField! = UITextField()
        textField.borderStyle = UITextBorderStyle.RoundedRect
        textField.font = UIFont.systemFontOfSize(14)
        textField.clearButtonMode = UITextFieldViewMode.WhileEditing        
        textField.setTranslatesAutoresizingMaskIntoConstraints(false)
        textField.delegate = self
        self.scrollView.addSubview(textField)


        // Left constraint 
        self.scrollView.addConstraint(NSLayoutConstraint(item: textField, attribute: NSLayoutAttribute.Left, relatedBy: NSLayoutRelation.Equal, toItem: self.scrollView, attribute: NSLayoutAttribute.Left, multiplier: 1.0, constant: 10))

        // Right constraint 
        self.scrollView..addConstraint(NSLayoutConstraint(item: textField, attribute: NSLayoutAttribute.Right, relatedBy: NSLayoutRelation.Equal, toItem: self.scrollView, attribute: NSLayoutAttribute.Right, multiplier: 1.0, constant: -10))

        // TOP Horizontal constraint
        let metrices = ["width" : self.view.bounds.width]            
        self.scrollView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[textField(width)]", options: NSLayoutFormatOptions(0), metrics: metrices, views: ["textField" : textField]))

        if previousTextField == nil {
            // Top vertical constraint
            self.scrollView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[textField]", options: NSLayoutFormatOptions(0), metrics: nil, views: ["textField" : textField]))
        } else {
            // Top constraint to previous view
            self.scrollView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[previousTextField]-(10)-[textField]", options: NSLayoutFormatOptions(0), metrics: nil, views: ["textField" : textField, "previousTextField" : previousTextField]))
        }
        previousTextField = textField
    }

    if previousTextField != nil {
        // This below constraints will increase UIScrollView content size
        let constraint1 = NSLayoutConstraint.constraintsWithVisualFormat("H:[previousTextField]|", options: NSLayoutFormatOptions(0), metrics: nil, views: ["previousTextField" : previousTextField])
        self.scrollView.addConstraints(constraint1)

        let constraint2 = NSLayoutConstraint.constraintsWithVisualFormat("V:[previousTextField]|", options: NSLayoutFormatOptions(0), metrics: nil, views: ["previousTextField" : previousTextField])
        self.scrollView.addConstraints(constraint2)
    }

}
票数 2
EN

Stack Overflow用户

发布于 2016-06-09 14:00:47

只需将这些textFields的高度约束设为零。

代码语言:javascript
复制
textFieldHeightConstraint.constant = 0;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32517069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档