UITextField 虽然不是复杂的控件,但因为很多功能不熟悉的缘故,每次还是会浪费很多时间去实现想要的功能,下面对常用的方法进行一下汇总:
1、对输入内容的监听
通过监听 UIControlEventEditingChanged 状态,实现对输入的内容的处理,常用于限制输入位数、限制输入内容等。
{
[self.passwordTextField addTarget:self action:@selector(textFieldDidChanged:) forControlEvents:UIControlEventEditingChanged];
[self.repeatTextField addTarget:self action:@selector(textFieldDidChanged:) forControlEvents:UIControlEventEditingChanged];
}
- (void)textFieldDidChanged:(UITextField *)textField
{
if (textField.text.length > 11) {
textField.text = [textField.text substringToIndex:11];
}
}
2、处理键盘弹出、收回事件。
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
[self keyboardAnimate:textField show:YES];
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
[self keyboardAnimate:textField show:NO];
}
- (void)keyboardAnimate:(UITextField *)textField show:(BOOL)willShow
{
CGFloat dist = self.backgroundView.frame.origin.y + [textField superview].frame.origin.y + textField.frame.origin.y + textField.frame.size.height - (self.backgroundView.frame.size.height - 216.0);
CGFloat offset = (willShow ? - dist : 0);
// 键盘弹出时,若dist为负,则不需要上移_backgroudView
if (willShow) {
if (dist < 0) {
offset = 0;
}
}
_backgroudViewTop.constant = offset;
[UIView animateWithDuration:0.25f animations:^{
[self.view layoutIfNeeded];
}];
}
注意:坐标原点在左上角、textFiled父视图坐标。
思路
- 键盘弹出时,需要计算合适的视图上移距离 offset,计算公式:
offset = textFiled 底部y - ( backgroundView.height - keyboard.height );
上面的例子中将 keyboard.height 直接设为216.0,可监听键盘事件, 获取当前键盘高度,更为准确。
- 修改背景视图的frame,对整个视图进行上移。
另,当父视图或textFiled存在autoLayout关系时,需要更改对应的约束值,然后刷新autoLayout。
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *backgroudViewTop;
_backgroudViewTop.constant = offset;
[UIView animateWithDuration:0.25f animations:^{
[self.view layoutIfNeeded];
}];
网友评论