使用自动布局pipe理UITextField的dynamic位置
我的客户的要求如下:
我将创build大约15个textField(在服务器上定义)的registry单。 注册字段中的字段信息来自服务器。 在某些情况下,有可能不需要某些字段。 所以,我会得到这个特定情况下所需的字段。
例如,假设服务器上的预定义字段数是15。 即名,姓,电话号码,出生date,图片,电子邮件,地址,邮政编码等
但有些情况下,在某些情况下,电子邮件ID字段不是必需的。 所以我不会从服务器获得该字段。 所以,应用程序方面,我必须从预定义的字段列表中隐藏电子邮件文本字段。
也有可能多个(任何字段)字段不是必需的。 所以我也要把它们藏起来 我想通过图像表示来解释情况如下。
情况1:
案例2:
在这种情况下,我正在做的是(应用程序端)我为所有预定义的字段创buildtextFields。 那么我隐藏的文本域是不需要的每个服务器响应。 即电子邮件文本字段或任何其他textField。
现在我的问题是,如果任何字段不是必需的,那么文本字段应该重新定位,我在我的应用程序中使用自动布局。 我隐藏电子邮件文本框然后如何设置下一个文本框的位置,如联系号码,出生date等?
是的,这是完全可能的自动布局。
这里最重要的是:
您不需要手动重新定位,这项工作将通过自动布局完成。
你必须做以下的事情:
- 使用
UIScrollView
并添加所有的UITextField
。 所以内容的大小和位置的变化都会很容易pipe理。 这里scrollView的内容大小也是由Auto layout来pipe理的,所以不要手动去做。 - 不要为
UITextField
手动分配帧。 例如在创buildtextField时使用CGRect
。 - 使用VFL(可视化格式化语言)。 这是一个function强大的自动布局语言,可以使您的代码在运行时dynamic更改。
-
为所有
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;
- 使用自动布局,如何使UIImageView的大小dynamic取决于图像?
- ios 8 UITableViewCell细节文本没有正确更新
- 如何在animateTransition期间获取ToViewController中子视图的框架:?
- 带有AutoLayout错误标题的UISegmentedControl
- 为什么UITableViewCell具有自动布局约束冲突
- Autolayout在iOS 8上工作正常,但在iOS 6和7(我使用XCode 6.2)上performance不佳,
- 我有一个UILabel自动布局定位在屏幕上,但是当我隐藏导航栏,它会导致标签“抽搐”第二个
- UICollectionView iOS 9在支持RTL语言的项目上发布
- 在Swift 3中以编程方式使用ScrollView