UISearchController:searchBar 和 scopeBar 在第一次触摸事件上重叠
Posted
技术标签:
【中文标题】UISearchController:searchBar 和 scopeBar 在第一次触摸事件上重叠【英文标题】:UISearchController: searchBar and scopeBar overlap on first touch event 【发布时间】:2015-07-15 07:52:44 【问题描述】:我正在尝试使用 Apple 最新的 UISearchController 实现一个简单的搜索栏。但是,如果我使用搜索栏的范围栏来获取过滤器选项,我似乎无法让它正常工作.
范围栏总是显示我可以接受
但在第一次触摸事件时,搜索栏和范围栏会重叠。
我使用了 Apple 的 TableView 示例代码应用程序,但它没有任何改变。
- (void)viewDidLoad
[super viewDidLoad];
_resultsTableController = [[APLResultsTableController alloc] init];
_searchController = [[UISearchController alloc] initWithSearchResultsController:self.resultsTableController];
self.searchController.searchResultsUpdater = self;
[self.searchController.searchBar sizeToFit];
self.searchController.searchBar.showsScopeBar = YES;
[self.searchController.searchBar setScopeButtonTitles:@[@"First",@"Second"]];
self.tableView.tableHeaderView = self.searchController.searchBar;
// we want to be the delegate for our filtered table so didSelectRowAtIndexPath is called for both tables
self.resultsTableController.tableView.delegate = self;
self.searchController.delegate = self;
self.searchController.dimsBackgroundDuringPresentation = NO; // default is YES
self.searchController.searchBar.delegate = self; // so we can monitor text changes + others
// Search is now just presenting a view controller. As such, normal view controller
// presentation semantics apply. Namely that presentation will walk up the view controller
// hierarchy until it finds the root view controller or one that defines a presentation context.
//
self.definesPresentationContext = YES; // know where you want UISearchController to be displayed
我也实现了搜索栏的委托方法,但它只是切换了重叠的时间。
有没有人能够使用 iOS 8s UISearchController 和 searchBar 的范围栏实现搜索栏?
提前致谢
【问题讨论】:
您找到解决方案了吗? 从纵向切换到横向再回到纵向时,我的行为相同。如果在此过程中搜索处于活动状态(即:seachBar 是 firstResponder),那么我会得到相同的结果:scopeButtons 在 searchBar 后面可见......在 UISearchDisplayController 之后,UISearchController...... 和它的前身一样有缺陷,干得好 Apple ^^ 【参考方案1】:我刚刚花了三天时间解决这个问题,浏览了我能找到的所有帖子,最后在 Apple Dev 论坛上找到了解决方案,所以我想我会发布一个更新来帮助下一个遇到这个问题的人。
解决方法是确保搜索栏上属于 UISearchController 的 showsScopeBar 属性设置为 false,即 Swift 中的UISearchController.searchBar.showsScopeBar = false
。
问题似乎是 Apple 的设计意图是让 showsScopeBar
属性与独立搜索栏一起使用,而不是由 UISearchController 控制的搜索栏。不幸的是,课程文档中没有提到这一点。我认为糟糕的设计决定,但事实就是如此。
讨论在以下线程 https://devforums.apple.com/thread/235803(截至 2018-01-26 的死链接)。
祝你好运。
【讨论】:
【参考方案2】:这似乎是一个已知缺陷。有几个 radr 条目,例如 http://www.openradar.me/20702394,它们引用了类似的问题以及使用 sizeToFit() 的解决方法
他们建议的解决方法有效,但仅当它应用于 viewDidLayoutSubviews 时。即在所有视图都布置好之后。
override func viewDidLayoutSubviews()
self.searchController.searchBar.sizeToFit()
【讨论】:
遗憾的是这对我不起作用。但是最终对我有用的是在 -(void)didPresentSearchController:(UISearchController *)searchController [searchController.searchBar sizeToFit]; 中使用 sizeToFit 【参考方案3】:Swift 3 更新:
searchController.searchBar.showsScopeBar = false
Swift 4 更新:
似乎在 swift 4 和 ios 11 中搜索栏发生了变化。使用上面显示的方法,在某些情况下,范围栏将位于搜索栏内。
if #available(iOS 11.0, *)
navigationItem.searchController = searchController
navigationItem.hidesSearchBarWhenScrolling = false
else
tableView.tableHeaderView = searchController.searchBar
这为我解决了问题。如果 ios 10 可用,我使用上面显示的表格。如果 ios 11 可用,我会更改我的技术并将导航视图控制器设置为搜索控制器。你会注意到它看起来和 ios 10 上的一模一样
【讨论】:
showScopeBar 属性仅与自定义搜索栏相关。如果您指定您的范围按钮标题并将 schowsScopeBar 设置为 false 一切都应该工作,因为否则您正在创建 scopeBars。一个由 SearchBarController 自动创建,另一个通过将 .showsScopeBar 设置为 true 来创建。如果您将其设置为 false,则范围栏只会在您实际搜索某些内容时显示,并且不会与 searchBar 重叠以上是关于UISearchController:searchBar 和 scopeBar 在第一次触摸事件上重叠的主要内容,如果未能解决你的问题,请参考以下文章
在 UITableView Objective-C 中实现 UISearchController
在 UISearchController 中按取消后导航栏被阻止