以编程方式将iPhone键盘顶部的工具栏对齐

时间:2020-03-06 14:59:10  来源:igfitidea点击:

在某些情况下,我想在iPhone键盘的顶部添加一个工具栏(例如,在导航表单元素时,例如在iPhone Safari中)。

当前,我正在使用常量指定工具栏的矩形,但是由于每次其他较小的界面更改时,界面的其他元素都在屏幕顶部的流量工具栏和导航栏中,因此工具栏会失去对齐。

有没有办法以编程方式确定键盘相对于当前视图的位置?

解决方案

无法(AFAIK)获取键盘视图的尺寸。但是,至少在到目前为止的每个iPhone版本中,它都是恒定不变的。

如果将工具栏位置计算为相对于视图底部的偏移量,并且考虑了视图的大小,则不必担心导航栏是否存在。

例如。

#define KEYBOARD_HEIGHT 240 // example - can't remember the exact size
#define TOOLBAR_HEIGHT 30

toolBarRect.origin.y = viewRect.size.height - KEYBOARD_HEIGHT - TOOLBAR_HEIGHT;

// move toolbar either directly or with an animation

不用定义,我们可以轻松地创建一个" keyboardHeight"函数,该函数根据是否显示键盘来返回大小,并将此工具栏位置移动到一个单独的函数中,以重新组织布局。

而且,这可能取决于我们在何处进行定位,因为根据导航栏的设置,视图的大小可能会在加载和显示之间发生变化。我相信最好的方法是在viewWillAppear中。

如果我们注册键盘通知,即UIKeyboardWillShowNotification UIKeyboardWillHideNotification等,则收到的通知将在userInfo dict(UIKeyboardBoundsUserInfoKey)中包含键盘的边界。

参见" UIWindow"类参考。

所以基本上:

在init方法中:

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self selector:@selector(keyboardWillShow:) name: UIKeyboardWillShowNotification object:nil];
[nc addObserver:self selector:@selector(keyboardWillHide:) name: UIKeyboardWillHideNotification object:nil];

然后使用上面提到的方法来调整条的位置:

-(void) keyboardWillShow:(NSNotification *) note
{
    CGRect r  = bar.frame, t;
    [[note.userInfo valueForKey:UIKeyboardBoundsUserInfoKey] getValue: &t];
    r.origin.y -=  t.size.height;
    bar.frame = r;
}

可以通过将位置变化动画化来使其变得漂亮

[UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];
//...
    [UIView commitAnimations];

在3.0及更高版本中,我们可以从通知的userInfo字典中获取动画的持续时间和曲线。

例如,要动画化视图的大小以为键盘腾出空间,请注册UIKeyboardWillShowNotification并执行以下操作:

- (void)keyboardWillShow:(NSNotification *)notification
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationCurve:[[[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]];
    [UIView setAnimationDuration:[[[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]];

    CGRect frame = self.view.frame;
    frame.size.height -= [[[notification userInfo] objectForKey:UIKeyboardBoundsUserInfoKey] CGRectValue].size.height;
    self.view.frame = frame;

    [UIView commitAnimations];
}

对UIKeyboardWillHideNotification做类似的动画。

从iOS 3.2开始,有一种新方法可以实现此效果:

UITextFields和UITextViews具有一个inputAccessoryView属性,我们可以将其设置为任何视图,该视图会自动显示在上方并使用键盘进行动画处理。

请注意,我们使用的视图既不应位于其他视图层次中,也不应将其添加到某些超级视图中,这是为我们完成的。