UISearchController:searchBar和scopeBar在第一次触摸事件时重叠

时间:2015-07-15 07:52:45

标签: ios cocoa-touch uikit uisearchbar uisearchcontroller

我正在尝试使用Apple的最新UISearchController实现一个简单的搜索栏。但是,如果我使用搜索栏的范围栏来获取过滤器选项,我似乎无法正常工作。

范围栏始终显示,我可以忍受 at startup scope bar always shows

但是在第一次触摸事件中,搜索栏和示波器条重叠。 Search bar and scopebar collapse

我使用过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的范围栏实现搜索栏?

提前致谢

3 个答案:

答案 0 :(得分:2)

我花了三天时间处理同一个问题,通过我能找到的所有帖子,最后在Apple Dev论坛上找到了解决方案,所以我想发布一个更新来帮助下一个遇到这个问题的人。

解决方法是确保属于UISearchController的搜索栏上的showsScopeBar属性设置为false,即Swift中的UISearchController.searchBar.showsScopeBar = false

问题似乎是Apple的设计意图是将showsScopeBar属性与独立搜索栏一起使用,而不是由UISearchController控制的搜索栏。不幸的是,在课程文档中没有提到这一点。在我看来,糟糕的设计决定,但它就是它。

讨论在以下主题 https://devforums.apple.com/thread/235803 (截至2018-01-26的死链接)。

祝你好运。

答案 1 :(得分:1)

这似乎是一个已知的缺陷。有几个radr条目,例如http://www.openradar.me/20702394引用类似的问题,并使用sizeToFit()

来解决方法

他们建议的解决方法有效,但只有在viewDidLayoutSubviews中应用时才有效。即在所有意见都已列出之后。

$("#formId").serialize()

答案 2 :(得分:1)

更新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完全一样