使用自动布局pipe理UITextField的dynamic位置

我的客户的要求如下:

我将创build大约15个textField(在服务器上定义)的registry单。 注册字段中的字段信息来自服务器。 在某些情况下,有可能不需要某些字段。 所以,我会得到这个特定情况下所需的字段。

例如,假设服务器上的预定义字段数是15。 即名,姓,电话号码,出生date,图片,电子邮件,地址,邮政编码等

但有些情况下,在某些情况下,电子邮件ID字段不是必需的。 所以我不会从服务器获得该字段。 所以,应用程序方面,我必须从预定义的字段列表中隐藏电子邮件文本字段。

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

情况1:

在这里输入图像说明

案例2:

在这里输入图像说明

在这种情况下,我正在做的是(应用程序端)我为所有预定义的字段创buildtextFields。 那么我隐藏的文本域是不需要的每个服务器响应。 即电子邮件文本字段或任何其他textField。

现在我的问题是,如果任何字段不是必需的,那么文本字段应该重新定位,我在我的应用程序中使用自动布局。 我隐藏电子邮件文本框然后如何设置下一个文本框的位置,如联系号码,出生date等?

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

这里最重要的是:

您不需要手动重新定位,这项工作将通过自动布局完成。

你必须做以下的事情:

  1. 使用UIScrollView并添加所有的UITextField 。 所以内容的大小和位置的变化都会很容易pipe理。 这里scrollView的内容大小也是由Auto layout来pipe理的,所以不要手动去做。
  2. 不要为UITextField手动分配帧。 例如在创buildtextField时使用CGRect
  3. 使用VFL(可视化格式化语言)。 这是一个function强大的自动布局语言,可以使您的代码在运行时dynamic更改。
  4. 为所有UITextFields添加约束,并最初将hidden属性设置为No/False 。 从你的服务器响应和查询使它们可见,并通过简单地调用下面的方法来更新自动布局约束。

     // Change hidden property based on your response // ........ // ........ // Below methods will update auto layout [textField layoutIfNeeded]; [self.view layoutIfNeeded]; 

    您可以将这些方法放在animation块中,以获得充足的UI体验。

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


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

使用VFL创buildUIScrollView

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

UIScrollView添加UITextField

 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) } } 

只要将这些文本字段的高度限制为零。

 textFieldHeightConstraint.constant = 0;