iPhone 键盘隐藏 UISeachBar
Posted
技术标签:
【中文标题】iPhone 键盘隐藏 UISeachBar【英文标题】:IPhone Keyboard hides UISeachBar 【发布时间】:2011-09-16 06:21:25 【问题描述】:我在视图底部有一个搜索栏。问题是每当我在键盘上输入内容时,搜索栏仍然保留在底部,我无法查看我正在输入的内容。我想在键盘弹出时动态向上移动它,然后在键盘消失后收回其原始位置。不幸的是,我的应用程序的搜索栏必须位于底部,并且有点卡在这个位置。
有没有办法只在键盘出现时才向上移动搜索栏?任何代码 sn-ps 都会很有帮助。
【问题讨论】:
【参考方案1】:您最好的选择可能是在 UISearchBarDelegate 协议中使用 –searchBarShouldBeginEditing:。
看起来像这样:
- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar
CGRect newFrame = //some rect
mySearchBar.frame = newFrame;
return YES;//this is important!
- (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar
CGRect originalFrame = //the original frame
mySearchBar.frame = originalFrame;
return YES;
编辑:其他答案之一建议使用 UIKeyboard 通知,但这可能会令人困惑。但是,它确实具有在每次键盘出现时工作的优势,而不仅仅是在 UISearchBar 是第一响应者时工作。
编辑 2: Mayur Joshi 建议使用动画,可以这样做:
[UIView animateWithDuration:duration
animations:^
//what you want to animate (in this case, the search bar's frame)
completion:^(BOOL finished)
//what to do when the animation finishes
];
编辑 3: 如果您不想遮挡搜索栏后面的视图,则每当搜索栏向上移动时,您都必须缩小其高度。它可以与为搜索栏设置动画的代码放在同一位置。
【讨论】:
如果视图底部有一个 SearchBar,它应该只停留在那里。 SearchBar 一个人到处漫游,而剩下的 View 卡在那里是 Bad UI! 这就是 Frooti 要求做的。这是否是一个糟糕的 HI 决定不是问题的一部分。我已经在第二次编辑中解决了您对动画的评论。 嗯,答案就在那里。显然,用不好的 UI 或好的 UI 做某事是他的决定。 但这不一定是一个糟糕的 UI 决定。如果用户正在搜索栏中进行编辑,这显然是他们将要使用的东西,那么后面视图的遮挡不是问题。即便如此,我已经更新了我的答案以再次修复它。 没有冒犯您的答案,但 UI 是您开发 iPhone 应用程序时的主要标准。缩小你的视图可能不会被认为是糟糕的 UI,但是当你看到大多数成功的 iPhone 应用程序,并且当你选择任何文本字段或搜索栏或任何东西时,整个视图而不是那个特定元素会向下滚动或向下动画(不会缩小) .因此,向下滚动视图更容易接受。【参考方案2】:你好,试试这个 sBar 是 UISearchBar 对象。
- (void)keyboardWillShow:(NSNotification *)aNotification
// the keyboard is showing so resize the table's height
CGRect keyboardRect = [[[aNotification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
NSTimeInterval animationDuration =
[[[aNotification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
CGRect frame = sBar.frame;
NSLog(@"%f",frame.size.height);
NSLog(@"%f",frame.origin.y);
frame.origin.y=frame.origin.y- keyboardRect.size.height;
[UIView beginAnimations:@"ResizeForKeyboard" context:nil];
[UIView setAnimationDuration:animationDuration];
sBar.frame = frame;
NSLog(@"%f",frame.size.height);
NSLog(@"%f",frame.origin.y);
[UIView commitAnimations];
- (void)keyboardWillHide:(NSNotification *)aNotification
// the keyboard is hiding reset the table's height
CGRect keyboardRect = [[[aNotification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
NSTimeInterval animationDuration =
[[[aNotification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
CGRect frame = sBar.frame;
NSLog(@"%f",frame.size.height);
NSLog(@"%f",frame.origin.y);
frame.origin.y=frame.origin.y+ keyboardRect.size.height;
[UIView beginAnimations:@"ResizeForKeyboard" context:nil];
[UIView setAnimationDuration:animationDuration];
sBar.frame = frame;
NSLog(@"%f",frame.size.height);
NSLog(@"%f",frame.origin.y);
[UIView commitAnimations];
【讨论】:
【参考方案3】:您必须使用 UIScrollView 并将此搜索栏保留在该滚动视图中。现在,当您开始编辑搜索栏时,即
- (void) searchBarTextDidBeginEditing:(UISearchBar *)theSearchBar
为 UIScrollView 设置 scrollRectToVisible 方法,让你的 SearchBar 像这样可见....
[yourScrollView scrollRectToVisible:CGRectMake(0, 300, yourScrollView.frame.size.width, yourScrollView.frame.size.height) animated:YES];
当你在搜索栏中写下文字时,即
- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar1
将滚动视图 scrollRectToVisible 设置为其原始大小。
[yourScrollView scrollRectToVisible:CGRectMake(0, 0, yourScrollView.frame.size.width, yourScrollView.frame.size.height) animated:YES];
【讨论】:
UIScrollView 不是必须的,你可以简单地设置框架。 但随后将上面的框架调出然后将其扔到键盘上消失并且不对其进行动画处理,构成了一个糟糕的用户界面!不建议。另外,如果你只用 SearchBar 做动画,就会有 searchBar 只在这里和那里漫游。再次,糟糕的用户界面! 我已经在上面的编辑中解决了您对动画的投诉。 您只为搜索栏设置了动画。您要么需要为整个 View 设置动画,要么只使用 scrollView。以上是关于iPhone 键盘隐藏 UISeachBar的主要内容,如果未能解决你的问题,请参考以下文章