【发布时间】:2014-10-27 02:33:19
【问题描述】:
我有一个使用自动布局的登录视图。当我单击用户名文本文件输入一些信息时,视图会弹出键盘,然后键盘会阻止一些 UI。我想在代码中弹出键盘时更改一些 UI 的框架信息,但是由于 UI 使用自动布局,所以在代码中设置 UI 的框架不起作用。
我应该如何处理这种情况?
【问题讨论】:
标签: ios xcode swift autolayout
我有一个使用自动布局的登录视图。当我单击用户名文本文件输入一些信息时,视图会弹出键盘,然后键盘会阻止一些 UI。我想在代码中弹出键盘时更改一些 UI 的框架信息,但是由于 UI 使用自动布局,所以在代码中设置 UI 的框架不起作用。
我应该如何处理这种情况?
【问题讨论】:
标签: ios xcode swift autolayout
您应该为要修改的约束创建一个 IBOutlet,并在代码中更改(如果需要动画)其常量属性的值。
【讨论】:
您需要为NSLayoutConstraint 的常量值设置动画。
所以你创建一个这样的:
class ViewController: UIViewController {
var loginBox:UIView?;
var loginBoxTopConstraint:NSLayoutConstraint?;
override func viewDidLoad() {
...
self.initConstraints();
}
func initConstraints()
{
// init constraints here
}
...
}
然后你将约束初始化为这样的:
func initConstraints()
{
...
self.loginBoxTopConstraint = NSLayoutConstraint(item: self.loginBox!, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Top, multiplier: 1.0, constant: 150.0);
self.view.addConstraint(self.loginBoxTopConstraint!);
}
现在,当您的用户点击您的登录字段之一时,您的 UITextField 委托 didBeginEditing 会被调用。这是您为约束常量值设置动画的地方:
func textFieldDidBeginEditing(textField: UITextField) {
...
self.loginBoxTopConstraint?.constant = 20.0; // was 150 before
UIView.animateWithDuration(0.5, animations: { () -> Void in
self.view.layoutIfNeeded();
});
}
当用户完成输入文本字段时,应该调用 textFieldDidEnd 委托方法:
func textFieldDidEndEditing(textField: UITextField) {
...
self.loginBoxTopConstraint?.constant = 150.0; // reset to 150
UIView.animateWithDuration(0.5, animations: { () -> Void in
self.view.layoutIfNeeded();
});
}
希望对您有所帮助。
【讨论】:
initConstraints 函数中应该获取 loginBox 的约束,而不是创建并添加一个约束,对吧?如何获取 loginBox 的约束?