使用UIScrollview将UIToolBar移动到屏幕上方的键盘上方

时间:2015-06-02 09:46:13

标签: ios objective-c uiscrollview autolayout

我的iPhone应用程序中有一个由UITextView组成的屏幕。此文本视图包含在UIScrollView中。屏幕的目的是让用户输入文本,并可选择将图像附加到他正在写的内容上。因此,屏幕上还有一个UIToolbar,屏幕底部有一个摄像头按钮。屏幕结构如下:

-View
--UIScrollView
---UITextView
--UIToolbar
---UIButton

当用户导航到此屏幕时,viewDidAppear方法会将第一个响应者分配给uitextview元素,因此键盘会显示,这会隐藏工具栏和相机按钮。

我希望整个工具栏能够在键盘上方重新绘制,并在键盘隐藏时再次将自己定位在屏幕底部。

我在SO上找到相关帖子(如this one)。然而,这些方法引入了不希望的行为。例如,在上面的文章中实现解决方案,工具栏确实随键盘移动,但UIScrollView将其frame.origin.y坐标移动到屏幕顶部以上,因此用户无法看到他是什么打字。

我还尝试重置工具栏的框架,将其添加为IBOutlet并使用cgrectmake重新定位它。但是,经过多次尝试后,工具栏仍然停留在屏幕底部并被键盘隐藏:

- (void) liftMainViewWhenKeybordAppears:(NSNotification*)aNotification{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDuration:0.3];
    [UIView setAnimationCurve:<#(UIViewAnimationCurve)#>]

    CGRect frame = self.keyboardToolbar.frame;
    frame.origin.y = self.keyboardToolbar.frame.origin.y - 280;
    self.keyboardToolbar.frame = frame;

    [UIView commitAnimations];
}

我尝试了几次类似于上面代码的迭代,但在重新定位工具栏时都失败了。

简而言之,在uitextview元素完全利用空间的屏幕上,将工具栏放在键盘顶部的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

感谢RoryMcKinnel的指针。正如引用的文章在Swift中,我想我可能会粘贴适用于ObjC的解决方案

- (void)keyboardWillShowNotification:(NSNotification *)notification{
NSDictionary *userInfo = notification.userInfo;

double animationDuration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
CGRect keyboardEndFrame = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGRect convertedKeyboardFrame = [self.view convertRect:keyboardEndFrame fromView:self.view.window];
UIViewAnimationOptions rawAnimationCurve = (UIViewAnimationOptions)[userInfo[UIKeyboardAnimationCurveUserInfoKey] unsignedIntegerValue] << 16;
_toolBarBottomGuide.constant = CGRectGetMaxY(self.view.bounds) - CGRectGetMinY(convertedKeyboardFrame);
[UIView animateWithDuration:animationDuration delay:0.0 options:rawAnimationCurve animations:^{
    [self.view layoutIfNeeded];
} completion:nil];
}

请记住,此代码确实使工具栏按要求移动,但工具栏根本不可见。事实证明它隐藏在UIScrollView后面。通过在IB层次结构中滚动视图和工具栏元素之间移动顺序,可以轻松修复此问题。

上述方法适用于keyboardWillShow事件。您需要在键盘隐藏时添加相应的键盘,如下所示:

- (void)keyboardWillHideNotification:(NSNotification *)notification{
    NSDictionary *userInfo = notification.userInfo;

    double animationDuration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    CGRect keyboardEndFrame = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
    UIViewAnimationOptions rawAnimationCurve = (UIViewAnimationOptions)[userInfo[UIKeyboardAnimationCurveUserInfoKey] unsignedIntegerValue] << 16;
    _toolBarBottomGuide.constant = 0.0f;
    [UIView animateWithDuration:animationDuration delay:0.0 options:rawAnimationCurve animations:^{
        [self.view layoutIfNeeded];
    } completion:nil];
}