57

我正在使用 UISearchController 在表格视图的标题视图中显示搜索栏:

...
self.searchController.hidesNavigationBarDuringPresentation = NO;            
self.presentingTVC.tableView.tableHeaderView = self.searchController.searchBar;
[self.searchController.searchBar sizeToFit];
self.presentingTVC.tableView.tableHeaderView = self.searchController.searchBar;

(设置 tableHeaderView 属性两次是必要的,否则标题视图与第一行重叠,参见SO 上的几个答案

这是它的外观,在不活动时完美定位: 处于正确位置的非活动搜索栏

搜索栏在活动时应该保持原位 - 我不希望它向上移动以隐藏导航栏。但它意外地动画下来,在它和导航栏之间留下了一个空白区域:

显示搜索栏动画太低的屏幕截图

这是一段 奇怪的搜索栏动画视频

如果我只使用与 UISearchController 分开的搜索栏,它在变为活动状态时不会显示相同的行为。

在我的呈现视图控制器中,我有self.definesPresentationContext = YES;and self.navigationController.navigationBar.translucent = YES;,并且在 IB 中,没有一个“扩展边缘”框处于活动状态(所有这些似乎都是可能的事情,可能会导致搜索呈现关闭,从四处阅读)。

有谁知道我怎样才能阻止搜索栏向下动画?

4

15 回答 15

69

老问题,但我能够通过设置解决这个问题

self.extendedLayoutIncludesOpaqueBars = YES;

在我的视图控制器上。我认为问题是由于导航栏不透明,但在搜索控制器上设置hidesNavigationBarDuringPresentationNO,导致搜索栏在聚焦时错误地定位自身。

于 2015-11-05T05:16:36.143 回答
30

好的,所以我终于为自己找到了解决方案。尽管我们的代码/故事板中很可能还有其他内容(这就是为什么这是一个很难回答的问题),但在大多数情况下,我还是遵循了 Apple 关于 UISearchController 的教程:(https://developer.apple.com/library/ ios/samplecode/TableSearch_UISearchController/Introduction/Intro.html )

几乎我所有的代码都与他们的相同,但是当我在其中单击时,我无法让搜索栏不跳转。所以我所做的是在我的故事板中检查原始表格视图和搜索结果表格视图的“不透明条下”。这让搜索栏停止跳跃。

但是还有最后一个问题,即结果表视图的第一行被搜索栏隐藏了。为了解决这个问题,我添加self.tableView.contentInset = UIEdgeInsetsMake(kHeightOfTableViewCells, 0, 0, 0);viewDidLoad我的结果表视图的方法中。瞧!

于 2015-02-06T19:20:11.503 回答
28

UISearchBar我可以通过从 ViewController 中删除以下行 来防止向下移动:self.definesPresentationContext = YES;

于 2015-04-08T09:20:52.783 回答
22

定义PresentationContext = true

override func viewDidLoad() {
        super.viewDidLoad()

        searchController = UISearchController(searchResultsController: nil)
        searchController.searchResultsUpdater = self
        searchController.hidesNavigationBarDuringPresentation = false

        searchController.dimsBackgroundDuringPresentation = true
        searchController.searchBar.searchBarStyle = UISearchBarStyle.Prominent
        self.tableView.tableHeaderView = searchController.searchBar

        definesPresentationContext = true
于 2015-12-10T03:28:29.397 回答
16

轮到我了。当我遵循 WWDC 示例代码时,我也遇到了这个问题。

我注意到如果我没有设置 searchBar 的 scopeButtonTitles 属性,searchBar 将不可见。经过仔细检查,它只有一个 CGRectZero 框架。这意味着设置 scopeButtonTitles 设置幕后的框架。因此,如果不想显示任何 scopeButtonTitles,但仍不想将 UISearchBar 硬编码为特定高度,请将 scopeButtonTitles 设置为空数组。

self.searchController = UISearchController(searchResultsController: nil)
self.searchController.searchResultsUpdater = self
self.searchController.searchBar.scopeButtonTitles = []
self.tableView.tableHeaderView = self.searchController.searchBar

将 scopeButtonTitles 设置为 1 个字符串的数组将不会显示范围按钮标题,但仍有处理视图的逻辑,基本上会搞砸布局。

给 Apple QA 团队的道具(适用于 iOS 8)

于 2015-04-28T20:02:59.100 回答
15

我最近遇到了这个问题,没有一个解决方案对我有用。可能是因为我的 UI 更复杂(我的带有搜索支持的表格视图包含在 UiNavigationController 内的 UITabController 中)无论如何,上述工作人员都没有。我可以通过在以下位置找到的这段非常简洁的代码来简单地解决我的问题: UISearchController Not Redisplaying Navigation Bar on Rotate

- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar
{
    if (bar == searchController.searchBar) {
        return UIBarPositionTopAttached;
    }
    else { // Handle other cases
        return UIBarPositionAny;
    }
}

还有一件事要补充:在将我的所有控制器的层次结构设置为在不透明和顶部栏下扩展后,我的搜索栏开始隐藏在导航栏下,并且会在可能发生旋转后立即出现。这对我来说是一个提示,即存在一些布局错误,并且与我的布局相关的一些信息不正确。这个委托方法可以帮助我的控制器了解其他游牧搜索栏的情况!

于 2015-05-03T05:17:27.953 回答
6

找到了!这似乎是viewDidLoad呈现 vc 的进攻路线:

self.edgesForExtendedLayout = UIRectEdgeNone;

删除了它,搜索栏按预期保持在原位。

于 2015-02-05T23:42:45.510 回答
4

取消选中调整滚动视图插图

检查顶栏下

解决了我的问题在此处输入图像描述

于 2017-02-27T10:00:47.480 回答
2

对于 iOS 11 和 swift 4,在 viewController 中设置下面的行解决了我的问题(searchBar 跳下):

self.edgesForExtendedLayout = .bottom
于 2017-11-03T13:51:02.907 回答
1

我猜你设置了 UISearchBarframe.original.y = 64

有代码

if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) {
    [self setEdgesForExtendedLayout:UIRectEdgeNone];
}

searchBar.frame = CGRectMake(0, 0, 376, 44);

洗可以帮你

于 2016-05-06T02:33:55.973 回答
0

就我而言,设置导航栏以self.navigationController.navigationBar.translucent = NO;解决问题。似乎搜索栏表示层在布局搜索栏时没有考虑导航栏的半透明性。

我意识到这不是一个完美的解决方案,因为导航栏的半透明可能会影响其他地方的布局,但它至少解决了可能存在非半透明导航栏的问题。

于 2015-07-23T18:27:52.930 回答
0

如第一篇文章所述,每个人都需要不同的解决方案。所以这里是我的。我必须结合此页面上提到的两件事,即:

斯威夫特 2:

    navigationController?.navigationBar.translucent = true

    edgesForExtendedLayout = .None
于 2016-06-07T14:19:58.157 回答
0

我的是主控制器 .xib 文件中元素的顺序。

这行得通。

这有效

这没有用。

在此处输入图像描述

于 2020-01-20T02:51:26.880 回答
0

它非常简单,只需添加女巫搜索栏中表格视图的标题视图的 clipsToBounds = true 即可。

countryTableView.tableHeaderView?.clipsToBounds = true
于 2017-05-12T06:59:20.143 回答
0

如果您使用但UINavigationController不能使用TabBar

self.extendedLayoutIncludesOpaqueBars = true

您将需要此解决方案:https ://stackoverflow.com/a/46151063/3369381

于 2017-09-11T13:39:36.307 回答