在iOS8.0+的系统中提供了对第三方输入法的支持,这对广大的果粉来说或许是一个好消息,但对于万千的iOS应用程序开发人员来说更关心的是产品经理是否又要根据这更改需求或是第三方输入法是否会引发什么不必要的bug,毕竟以前写的程序只针对系统输入法。不巧的是这样的事情就发生在最近开发的App中——使用第三方输入法会三次接收到UIKeyboardWillChangeFrameNotification的通知(在一次点击UITextField的时候)。
具体的需求是这样的:当点击处于视图控制器底部的UITextField时想要它跟随弹出的键盘一起上升到与键盘相邻的位置,并在输入框视图的上部添加一个遮罩,点击遮罩时让输入框失去焦点。
要实现这种效果有很多种方法:在iOS5.0以前由于虚拟键盘的高度固定可以通过实现UITextField的代理方法- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField来实现:
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
UIView *alphaCoverView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT - 216 - 40)];
[alphaCoverView setBackgroundColor:[UIColor blackColor]];
alphaCoverView.alpha = 0;
[UIView animateWithDuration:0.25 animations:^{
alphaCoverView.alpha = 0.4;
}];
alphaCoverView.tag = 10001;
UITapGestureRecognizer *tapToResignirstResponder = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(textFielfWillResignirstResponder)];
[alphaCoverView addGestureRecognizer:tapToResignirstResponder];
[[[UIApplication sharedApplication].delegate window] addSubview:alphaCoverView];
[UIView animateWithDuration:0.3 animations:^{
self.m_spaceToBottom.co