在几种情况下,我想在iPhone键盘的顶部添加一个工具栏(例如,在iPhone Safari中导航表单元素时)。目前,我使用常量指定工具栏的矩形,但由于界面的其他元素(屏幕顶部的工具栏和导航栏)处于变化中,每次我们对界面进行微小更改时,工具栏就会失去对齐。是否有一种方法可以通过编程方式确定键盘相对于当前视图的位置?
uz75evzq1#
从iOS 3.2开始,有一种新方法可以实现这种效果:UITextFields和UITextViews有一个inputAccessoryView属性,您可以将其设置为任何视图,该属性会自动显示在上方并使用键盘制作动画。请注意,您使用的视图既不应该在其他视图层次结构中,也不应该将其添加到某个超级视图中,这是为您完成的。
UITextFields
UITextViews
inputAccessoryView
wa7juj8i2#
所以基本上在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; }
可以使它漂亮的动画位置的变化,通过 Package
[UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.3]; //... [UIView commitAnimations];
lo8azlld3#
这是基于tonklon的现有答案-我只是添加了一个代码片段,它显示了键盘顶部的半透明黑色工具栏,以及右侧的“done”按钮:
UIToolbar *toolbar = [[[UIToolbar alloc] init] autorelease]; [toolbar setBarStyle:UIBarStyleBlackTranslucent]; [toolbar sizeToFit]; UIBarButtonItem *flexButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil]; UIBarButtonItem *doneButton =[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(resignKeyboard)]; NSArray *itemsArray = [NSArray arrayWithObjects:flexButton, doneButton, nil]; [flexButton release]; [doneButton release]; [toolbar setItems:itemsArray]; [aTextField setInputAccessoryView:toolbar];
-resignKeyboard的表达式如下:
-resignKeyboard
-(void)resignKeyboard { [aTextField resignFirstResponder]; }
gj3fmq9x4#
如果您注册了键盘通知,例如UIKeyboardWillShowNotificationUIKeyboardWillHideNotification等,您收到的通知将包含userInfo dict(UIKeyboardBoundsUserInfoKey)中的键盘边界。请参见UIWindow类参考。
UIKeyboardWillShowNotification
UIKeyboardWillHideNotification
userInfo
UIKeyboardBoundsUserInfoKey
UIWindow
o7jaxewo5#
在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执行类似的动画。
vc9ivgsu6#
创建此方法并在ViewWillLoad上调用它:
- (void) keyboardToolbarSetup { if(self.keyboardToolbar==nil) { self.keyboardToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 44)]; UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStylePlain target:self action:@selector(anyAction)]; UIBarButtonItem *extraSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(anyOtherAction)]; NSArray *toolbarButtons = [[NSArray alloc]initWithObjects:cancelButton,extraSpace,doneButton, nil]; [self.keyboardToolbar setItems:toolbarButtons]; self.myTextView.inputAccessoryView=self.keyboardToolbar; } }
z31licg07#
没有办法(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函数来代替define,该函数根据是否显示键盘来返回大小,并将此工具栏位置移动到一个单独的函数中,以重新组织布局。它也可以取决于你在哪里做这个定位,因为它是可能的,您的视图的大小可能会改变之间加载和显示基于您的导航栏设置。我相信最好的地方做这将是在viewWillAppear。
keyboardHeight
7条答案
按热度按时间uz75evzq1#
从iOS 3.2开始,有一种新方法可以实现这种效果:
UITextFields
和UITextViews
有一个inputAccessoryView
属性,您可以将其设置为任何视图,该属性会自动显示在上方并使用键盘制作动画。请注意,您使用的视图既不应该在其他视图层次结构中,也不应该将其添加到某个超级视图中,这是为您完成的。
wa7juj8i2#
所以基本上
在init方法中:
然后使用上述方法调整杆的位置:
可以使它漂亮的动画位置的变化,通过 Package
lo8azlld3#
这是基于tonklon的现有答案-我只是添加了一个代码片段,它显示了键盘顶部的半透明黑色工具栏,以及右侧的“done”按钮:
-resignKeyboard
的表达式如下:gj3fmq9x4#
如果您注册了键盘通知,例如
UIKeyboardWillShowNotification
UIKeyboardWillHideNotification
等,您收到的通知将包含userInfo
dict(UIKeyboardBoundsUserInfoKey
)中的键盘边界。请参见
UIWindow
类参考。o7jaxewo5#
在3.0及以上版本中,您可以从
userInfo
通知字典中获取动画持续时间和曲线。例如,要设置视图大小的动画以便为键盘腾出空间,请注册
UIKeyboardWillShowNotification
并执行如下操作:对
UIKeyboardWillHideNotification
执行类似的动画。vc9ivgsu6#
创建此方法并在ViewWillLoad上调用它:
z31licg07#
没有办法(AFAIK)得到键盘视图的尺寸,但是它是恒定的,至少在目前的每一个iPhone版本中是这样。
如果将工具栏位置计算为距视图底部的偏移量,并考虑视图的大小,则不必担心导航栏是否存在。
例如
您可以轻松地创建一个
keyboardHeight
函数来代替define,该函数根据是否显示键盘来返回大小,并将此工具栏位置移动到一个单独的函数中,以重新组织布局。它也可以取决于你在哪里做这个定位,因为它是可能的,您的视图的大小可能会改变之间加载和显示基于您的导航栏设置。我相信最好的地方做这将是在viewWillAppear。