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
如果您使用UINavigationController
和TabBar
, 则不能使用:
self.extendedLayoutIncludesOpaqueBars = true
您将需要此解决scheme: https : //stackoverflow.com/a/46151063/3369381