我的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元素完全利用空间的屏幕上,将工具栏放在键盘顶部的正确方法是什么?
答案 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];
}