以编程方式将iPhone键盘顶部的工具栏对齐
在某些情况下,我想在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属性,我们可以将其设置为任何视图,该视图会自动显示在上方并使用键盘进行动画处理。
请注意,我们使用的视图既不应位于其他视图层次中,也不应将其添加到某些超级视图中,这是为我们完成的。