2

我的客户的要求如下:

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

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

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

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

情况1:

在此处输入图像描述

案例二:

在此处输入图像描述

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

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

4

2 回答 2

2

是的,这完全可以通过自动布局实现。

这里最重要的是:

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

您必须执行以下操作:

  1. 使用UIScrollView并添加所有UITextField内容。以便轻松管理内容大小和更改位置。这里 scrollView 的内容大小也是由 Auto layout 管理的,所以不要手动操作。
  2. 不要为UITextField. 例如,CGRect在创建 textField 时使用。
  3. 使用 VFL(视觉格式化语言)。这是一种功能强大的自动布局语言,它可以让您使用代码在运行时进行动态更改。
  4. 为所有添加约束UITextFields并最初将hidden属性设置为No/False. 通过简单地调用以下方法,从您的服务器响应和查询中使它们可见并更新自动布局约束。

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

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

注意:记住 VFL 不是一个简单的部分,您在使用它时必须小心。


添加可以帮助您的示例代码(但它在 Swift 中将其转换为 Objective C),VFL 的参数和值也可能有所不同,因为此代码符合我的要求。看看并根据您的需要进行更改。

UIScrollView使用 VFL创建:

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

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

}
于 2015-09-11T07:02:58.270 回答
0

只需将这些文本字段的高度约束设为零即可。

textFieldHeightConstraint.constant = 0;
于 2016-06-09T14:00:47.780 回答