Iphone UISearchBar';s范围按钮覆盖第一行结果

Iphone UISearchBar';s范围按钮覆盖第一行结果,iphone,ios,uitableview,uisearchbar,Iphone,Ios,Uitableview,Uisearchbar,我第一次使用UISearchBar,但它不能完全满足我的需要 激活范围按钮时,它们将覆盖表的第一行。查看所有搜索结果的唯一方法似乎是在编辑完成时隐藏范围按钮;在我的谷歌搜索中,我看到了这一点 我想要Mail拥有的功能,只要搜索框中有文本,范围按钮就会保持不变,并且您可以在更改活动范围按钮时看到搜索结果的变化。但是,如果没有范围按钮覆盖表的第一行,我想不出任何方法来实现这一点。您不能只向下滚动表格视图;搜索栏位于表视图的标题中,因此整个内容都会滚动到一起 感谢您的建议 在尝试以下Andrew的建议

我第一次使用UISearchBar,但它不能完全满足我的需要

激活范围按钮时,它们将覆盖表的第一行。查看所有搜索结果的唯一方法似乎是在编辑完成时隐藏范围按钮;在我的谷歌搜索中,我看到了这一点

我想要Mail拥有的功能,只要搜索框中有文本,范围按钮就会保持不变,并且您可以在更改活动范围按钮时看到搜索结果的变化。但是,如果没有范围按钮覆盖表的第一行,我想不出任何方法来实现这一点。您不能只向下滚动表格视图;搜索栏位于表视图的标题中,因此整个内容都会滚动到一起

感谢您的建议

在尝试以下Andrew的建议后更新

我忘记的一件事是,在ViewDidDisplay中,我向上滚动表视图内容,这样搜索框就不在屏幕顶部,但在需要时可以向下滚动。这显然是我问题的一部分。所以,在我看来

if (theSearchBar.showsScopeBar != YES) {
    [self.tableView setContentOffset:CGPointMake(0, 44) animated:YES];
}
在searchBarShouldBeginEditing中,我现在有:

[self.navigationController setNavigationBarHidden:YES];
[self.tableView setContentOffset:CGPointMake(0, -44) animated:YES];
[UIView beginAnimations:@"searchBarUp" context:nil];
[UIView setAnimationDuration:1.0f];
searchBar.frame = CGRectOffset(searchBar.frame, 0, -44);
[UIView commitAnimations];
这会给出正确的结果,但是当范围栏出现时,视图顶部和搜索栏顶部之间会有一个间隙,第一行被覆盖。然后滚动条(带范围按钮)向上滑动到位。这显然不是很好

我希望上述代码能够做到的是:

  • 隐藏导航栏,这会将表格的顶行放在状态栏的正下方

  • 向下滚动表格内容,将搜索栏顶部置于状态栏的正下方

  • 向上移动搜索栏,使搜索栏底部之间有44像素的间隙,由范围按钮填充

这似乎是实际情况,除非您可以看到导航条留下的间隙,直到滚动条向上移动以满足它。你可能认为这可以通过最后隐藏导航条来解决,但是没有。。。当我试着这样做的时候,我的第一行表格被覆盖了,在状态栏和搜索栏之间有一个导航栏大小的洞

另一件我觉得很奇怪的事情是,如果我按原样使用上面的代码片段,除了动画:调用setContentOffset时没有,我会得到不同的结果。在这种情况下,表的第一行未被覆盖,但搜索框位于视图顶部上方,无法向下滚动(它不会停留)。只有范围按钮可见。对我来说,仅仅关闭动画将改变结果是没有意义的

现在,您可能会认为,如果一切都在正确的位置,显示搜索结果就可以了。但是没有。即使导航栏现在不在图片中,搜索栏上面仍然有一个很大的间隙,需要对表格内容和搜索栏框架进行如上所述的调整

我应该注意,viewwillbeen中的代码只执行一次,因为我们从不离开视图,所以不是每次都向上调整表

我很想知道发生了什么,以及如何修复它,如果有人能帮我弄清楚的话

为清晰起见,再次更新-当我说“修复”时,我的意思是,当碎片移动到位时,使其看起来良好,没有明显的间隙。我甚至不一定想要动画;滑入到位的时间太长。但正如我上面提到的,关闭动画会使事情再次以错误的位置结束


最后一次更新-我通过移除线条周围的动画块来移动搜索栏,使它看起来更好。我想这在动画开始前就引起了停顿。现在已经足够好了,至少目前是这样。我仍然接受Andrew的回答,因为他把我引向了正确的方向。

在Mail.app的例子中,看起来他们用类似以下的东西隐藏了UINavigationBar:

[self.navigationController setNavigationBarHidden:YES animated:YES];
然后使用UIView动画,它们增加搜索栏的大小,以占据导航栏填充的空间

伪代码:

[UIView beginAnimations:@"foo" context:NULL];
[UIView setAnimationDuration:1.0f];
CGRect newFrame = CGRectMake(0,0,self.view.frame.size.width, mySearchBar.frame.size.height);
mySearchBar.frame = newFrame;
//optionally, you could do something like this instead of setting a new frame
// mySearchBar.frame = CGRectOffset(mySearchBar.frame, 0, -44);
[UIView commitAnimations];
这都属于UISearchBarDelegate方法

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar
然后当用户取消搜索时

– searchBarCancelButtonClicked:

您可以反转动画,然后再次显示导航栏。

在Mail.app的情况下,看起来他们用类似以下内容隐藏UINavigationBar:

[self.navigationController setNavigationBarHidden:YES animated:YES];
然后使用UIView动画,它们增加搜索栏的大小,以占据导航栏填充的空间

伪代码:

[UIView beginAnimations:@"foo" context:NULL];
[UIView setAnimationDuration:1.0f];
CGRect newFrame = CGRectMake(0,0,self.view.frame.size.width, mySearchBar.frame.size.height);
mySearchBar.frame = newFrame;
//optionally, you could do something like this instead of setting a new frame
// mySearchBar.frame = CGRectOffset(mySearchBar.frame, 0, -44);
[UIView commitAnimations];
这都属于UISearchBarDelegate方法

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar
然后当用户取消搜索时

– searchBarCancelButtonClicked:

您将反转动画,然后再次显示导航栏。

您使用的是UISearchDisplayController,对吗?如果没有,你应该。它会处理很多你自己要做的工作,比如隐藏导航栏

您正在使用UISearchDisplayController,对吗?如果没有,你应该。它会处理很多你自己要做的工作,比如隐藏导航栏

我也有同样的问题。因为我没有使用UISearchDisplayController(我想避免使用默认的搜索表视图)。所以我宁愿直接去搜索栏。现在的问题是搜索栏嵌入在一个表视图下(您可以在故事板中检查它)。要解决此问题,您必须在UIView下分别嵌入tableview和搜索栏。

我也遇到过同样的问题。因为我没有使用UISearchDisplayController(我想避免使用默认的搜索表视图)。所以我宁愿直接去搜索栏。现在的问题是搜索栏嵌入在一个表视图下(您可以在故事板中检查它)。要解决此问题,必须嵌入tableview和搜索栏