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

时间:2008-10-01 16:43:34

标签: ios iphone cocoa-touch keyboard

在某些情况下,我想在iPhone键盘的顶部添加一个工具栏(例如,当您浏览表单元素时,就像在iPhone Safari中一样)。

目前我正在使用常量指定工具栏的矩形,但由于界面的其他元素不断变化 - 工具栏和屏幕顶部的导航栏 - 每次我们进行次要界面更改时,工具栏都会失去对齐。

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

8 个答案:

答案 0 :(得分:142)

答案 1 :(得分:72)

基本上是这样的:

在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];

答案 2 :(得分:60)

这是基于existing answer from tonklon - 我只是添加了一个代码段,在键盘顶部显示了一个半透明的黑色工具栏,右侧还有一个“完成”按钮:

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看起来像:

-(void)resignKeyboard {
  [aTextField resignFirstResponder];
}

希望能有所帮助。

答案 3 :(得分:24)

如果您注册键盘通知,即UIKeyboardWillShowNotification UIKeyboardWillHideNotification等,您收到的通知将包含userInfo词典中的键盘界限(UIKeyboardBoundsUserInfoKey

请参阅UIWindow课程参考。

答案 4 :(得分:16)

在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执行类似的动画。

答案 5 :(得分:3)

我发现此链接非常有用,可以逐步了解inputaccesoryview。

input accessory view

答案 6 :(得分:0)

创建此方法并在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;
        }
}

答案 7 :(得分:-4)

无法获得键盘视图的尺寸(AFAIK)。然而,至少在目前为止每个iPhone版本都是如此。

如果您将工具栏位置计算为距离视图BOTTOM的偏移量,并考虑视图的大小,那么您不必担心是否存在导航栏。

E.g。

#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。