UISearchBar由UISearchController在表头视图中呈现的animation太激活时显示

我正在使用UISearchController在tableview的标题视图内显示一个search栏:

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

(其中设置tableHeaderView属性两次是必要的,否则标题视图重叠第一行,参考几个答案 )

这是它看起来的样子,完全处于非活动状态时的位置: 无效的搜索栏位置正确

search栏应该保持在活动状态 – 我不希望它向上移动以隐藏导航栏。 但它意外地缩小了,在它和导航栏之间留下了一个空白区域:

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

这是一个奇怪的search栏animationvideo

如果我只是单独使用search栏从UISearchController,它不会显示相同的行为,当它变为活动。

在我的呈现视图控制器中,我有self.definesPresentationContext = YES;self.navigationController.navigationBar.translucent = YES; ,而在IB中,没有任何“扩展边缘”框是活动的(所有这些似乎都是可能导致search呈现的东西,从阅读的周围)。

有谁知道我可以停止search栏从animation下来?

好吧,所以我终于想出了自己的解决scheme。 尽pipe我们在代码/故事板中可能还有其他的东西(这就是为什么这是一个难以回答的问题),但大部分情况下,我遵循苹果的UISearchController教程:( https://developer.apple.com/library/ ios / samplecode / TableSearch_UISearchController / Introduction / Intro.html )

几乎所有我的代码都与他们的代码完全相同,但是当单击它时,我无法使search栏跳转。 所以我所做的是在原始表格视图和我的故事板中的search结果表格视图中选中“不透明的酒吧”。 这让search栏停止跳跃。

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

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

self.extendedLayoutIncludesOpaqueBars = YES;

在我的视图控制器上。 我认为是问题是由于有一个不透明的导航栏,但将您的search控制器上的hidesNavigationBarDuringPresentation导航栏hidesNavigationBarDuringPresentation设置为NO导致search栏不正确定位自己时聚焦。

我能够通过从我的ViewController删除以下行防止UISearchBar下移: self.definesPresentationContext = YES;

definesPresentationContext = 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 

轮到我了。 当我遵循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个string的数组不会显示范围button的标题,但仍然有处理视图的逻辑,基本上搞砸了布局。

支持苹果的QA团队(适用于iOS 8)

我刚才遇到这个问题,没有任何解决scheme为我工作。 也许是因为我的UI更复杂(我的表格视图与UiNavigationController中的UITabController中包含search支持)无论如何,没有上述工人。 我可以简单地解决我的问题,我find了这个非常整洁的一段代码: UISearchController不能重新显示导航栏旋转

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

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

find了! 这似乎是viewDidLoad呈现vc中的进攻线:

 self.edgesForExtendedLayout = UIRectEdgeNone; 

删除了那个和search栏保持原位。

我想你设置UISearchBar frame.original.y = 64

有代码

 if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) { [self setEdgesForExtendedLayout:UIRectEdgeNone]; } searchBar.frame = CGRectMake(0, 0, 376, 44); 

洗可以帮助你

取消选中调整滚动查看插图

检查顶部酒吧

解决了我的问题 在这里输入图像说明

在我的情况下,将导航栏设置为self.navigationController.navigationBar.translucent = NO; 解决了这个问题。 看起来,在布局search栏时,search栏表示层没有考虑导航栏的半透明度。

我意识到这不是一个完美的解决scheme,因为导航栏的半透明可以抛弃其他地方的布局,但它至less可以解决在非透明导航栏的情况下可能的问题。

正如第一篇文章中提到的,每个人都需要一个不同的解 所以这是我的。 我不得不把这个页面上提到的两件事情结合起来,即:

Swift 2:

  navigationController?.navigationBar.translucent = true edgesForExtendedLayout = .None 

其非常简单的做法是在巫婆search栏中添加表视图的标题视图的clipsToBounds = true。

 countryTableView.tableHeaderView?.clipsToBounds = true 

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

 self.edgesForExtendedLayout = .bottom 

如果您使用UINavigationControllerTabBar则不能使用:

 self.extendedLayoutIncludesOpaqueBars = true 

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