取消搜索时 setContentOffset 不正确

Posted

技术标签:

【中文标题】取消搜索时 setContentOffset 不正确【英文标题】:setContentOffset not correctly when canceling a search 【发布时间】:2010-09-22 22:04:41 【问题描述】:

我有一个包含 UISearchBar 的视图。此 UISearchBar显示在页面顶部 - 它位于屏幕顶部下方约 90 pts 处,位于标题图像下方。

视图的所有元素都包装在 UIScrollView 中。当用户在 UISearchBar 中点击时会发生正确的事情 - 整个视图向上滚动,因此搜索栏位于屏幕的最顶部,视图内容上会出现一个深色叠加层,并且键盘向上滑动。

到目前为止一切顺利。当我想取消搜索并将所有内容返回到之前的位置(UISearchBar 不再位于屏幕顶部)时,问题就出现了。

如果用户在键盘显示时点击取消,我可以执行此操作 - 只需侦听 UIKeyboardWillHideNotification,然后将滚动视图的内容偏移设置回 (0, 0)。

但是,如果用户在某些搜索结果上拖动手指,则键盘将消失,因此您可以获得更大的搜索结果视图。如果用户随后点击取消,搜索栏仍保留在页面顶部,一切看起来都很糟糕。

我尝试将“setContentOffset”代码放入 UISearchDisplayDelegate:

- (void)searchDisplayController:(UISearchDisplayController *)controller didHideSearchResultsTableView:(UITableView *)tableView

  [_scrollView setContentOffset:CGPointMake(0,0) animated:YES];

这可行,但看起来不太好,因为滚动直到搜索结果消失后才会发生(因此您会看到两个单独的动画)。

然后我尝试了这个方法(在表格视图被隐藏之前调用):

- (void)searchDisplayController:(UISearchDisplayController *)controller willHideSearchResultsTableView:(UITableView *)tableView

  [_scrollView setContentOffset:CGPointMake(0,0) animated:YES];

但是,这没有任何效果。内容偏移量没有改变。

有什么建议吗?

【问题讨论】:

【参考方案1】:

也许搜索显示控制器正在为您设置内容偏移量?请尝试在searchDisplayController:didShowSearchResultsTableView: 中设置内容偏移量。

【讨论】:

搜索显示控制器肯定会在搜索栏第一次获得焦点时设置内容偏移量。我遇到的问题是将滚动视图偏移量返回到 0, 0 当用户点击取消并且键盘已经隐藏时。 searchDisplayController:didShowSearchResultsTableView: 用户点击取消时从不调用。 如果你不介意一些不正当的事情,你可以使用-(BOOL)respondsToSelector:(SEL)selector NSLog(@"%@",NSStringFromSelector(selector)); return [super respondsToSelector:selector]; 之类的东西来查看 UISearchDisplayController 使用的其他方法,并覆盖它们以查看它们是否有任何效果。

以上是关于取消搜索时 setContentOffset 不正确的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 无限滚动 setContentOffset

动画时UIScrollView setContentOffset?

搜索引擎中隐性关键词的使用不构成不正当竞争

百度诉一公司欺骗其排序算法,涉“搜索引擎优化”不正当竞争

setContentOffset:动画:如果动画 = NO,则不会做任何事情

UIScrollView 没有使用 setContentOffset:animated 滚动到正确的位置: