当textField成为第一响应者时获取外部/虚拟键盘的事件

时间:2013-09-09 06:53:09

标签: iphone objective-c uitextfield virtual-keyboard

在我的iPad应用程序中,我使用表单样式呈现控制器

controller.modalPresentationStyle=UIModalPresentationFormSheet;

在横向模式下,当设备的键盘打开时,设置tableView的大小,以便用户可以查看表的所有记录。

获取显示/隐藏键盘的事件。我已设置NSNotification

问题

但是当用户使用外部/虚拟键盘点击表格单元格的textField时,我没有得到键盘显示/隐藏的事件。 因此,当textfield成为第一响应者时,Tableview大小正在减少,但是当用户使用外部键盘连接时则不需要。

任何人都可以在这里指导/帮助,我该怎么办?因此,我可以在使用外部键盘时停止设置大小。

注册键盘事件

- (void)registerForKeyboardNotifications{

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWasShown:)
                                             name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWasHidden:)
                                             name:UIKeyboardDidHideNotification object:nil];

}

在AutoRotate和文本字段成为第一响应者时设置框架

-(void)setFramesOfTable
{

CGRect rct=tableView.frame;
if(appDel.isThisIPad && ([[UIApplication sharedApplication] statusBarOrientation]==UIInterfaceOrientationLandscapeLeft || [[UIApplication sharedApplication] statusBarOrientation]==UIInterfaceOrientationLandscapeRight) && [selectedField isFirstResponder])
{
    rct.size.height=400.0;
}
else
{
    rct.size.height=576.0;
}
tableView.frame=rct;
}

- (void)textFieldDidBeginEditing:(UITextField *)textField{

selectedField = textField;
[self setFramesOfTable];
}

-(NSUInteger)supportedInterfaceOrientations
{
[self setFramesOfTable];
return UIInterfaceOrientationMaskAll;
}

感谢。

1 个答案:

答案 0 :(得分:1)

在文本字段开始编辑时更改表格的框架不是一个好主意。在iPad上,用户可以使用外接键盘,固定键盘或分离式键盘。

如果用户有外接键盘,则无需调整窗口大小。使用外接键盘时不会出现屏幕键盘,因此没有理由调整窗口大小。

如果用户使用的是拆分键盘,则无需担心调整窗口大小。如果他们拆分键盘,他们可以将键盘放在用户界面的中间,这样就不可能(或者至少不切实际)重新安排你的UI,因此它至少不会被分离键盘的一小部分覆盖。如果用户拆分键盘并覆盖重要的UI组件,他们需要将键盘移开。

调整UI大小的最佳方法是在键盘中使用ChangeFrame / Hide方法

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];

在这些事件的处理程序中,您可以获得键盘高度,并相应地调整UI

-(void)keyboardWillChangeFrame:(NSNotification*)notification
{
    NSDictionary* info = [notification userInfo];
    NSValue* kbFrame = info[UIKeyboardFrameEndUserInfoKey];
    NSTimeInterval animationDuration = [info[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    CGRect keyboardFrame = [kbFrame CGRectValue];
    BOOL isPortrait = UIDeviceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation);
    CGFloat height = isPortrait ? keyboardFrame.size.height : keyboardFrame.size.width;
}

这将获得animationDuration和键盘的高度,以便您可以使用UIView animateWithDuration块为框架视图的帧更改设置动画,以便键盘不会遮挡它。

在KeyboardWillHide中的

:您只需要从NSNotification获取animationDuration(与上面相同)(高度显然为0)。然后使用另一个UIView animateWithDuration块为您的tableview设置动画,将其大小调整为原始大小