UISearchBar范围按钮覆盖第一行结果

时间:2011-06-28 23:40:32

标签: iphone ios uitableview uisearchbar

我第一次使用UISearchBar,并不能完全按照自己的意愿行事。

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

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

建议赞赏!

在下面尝试安德鲁的建议后更新。

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

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时没有,我得到一个不同的结果。在这种情况下,表格的第一行未被覆盖,但搜索框位于视图顶部之上,无法向下滚动(它不会停留)。只有范围按钮可见。对我来说,仅仅关闭动画会改变结果是没有意义的。

现在,您可能会认为,如果所有内容都在正确的位置,那么显示搜索结果就可以了。但不是。即使导航栏现在不在图片中,搜索栏仍然会在其上方留下较大的间隙,并且需要对表格内容和搜索栏框架进行相同的调整。

我应该注意,viewWillAppear中的代码只执行一次,因为我们从不离开视图,因此不是每次都要向上调整表格的情况。

我很想知道发生了什么,以及如何修复它,如果有人能帮助解决问题。

为了清晰起见再次更新 - 当我说“修复它”时,我的意思是当它们移动到位时使其看起来很好而没有可见的间隙。我甚至不一定想要它的动画;滑入位置需要太长时间。但正如我上面提到的那样,关闭动画会让事情再次出现在错误的地方。

最后一次更新 - 我通过删除行周围的动画块来移动搜索栏,让它看起来更好。我想在动画开始之前就引入了暂停。现在已经足够好了,至少目前是这样。我仍然接受安德鲁的回答,因为他引导我朝着正确的方向前进。

4 个答案:

答案 0 :(得分:2)

对于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:

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

这就是我所做的,我正在使用SearchViewController:

if #available(iOS 11.0, *) {
    navigationItem.searchController = searchController
    }
    else{
        tableView.tableHeaderView = searchController.searchBar
    }