iOS9 Scope Bar显示在搜索栏的后面或旁边

时间:2016-06-02 05:14:00

标签: ios9 uisearchbar uisearchcontroller

我有一个自定义UITableViewController UISearchController设置为tableHeaderView,如下viewDidLoad()内所示:

    definesPresentationContext = true
    searchController.searchResultsUpdater = self
    searchController.searchBar.delegate = self
    searchController.dimsBackgroundDuringPresentation = false
    if #available(iOS 9.1, *) {
        searchController.obscuresBackgroundDuringPresentation = false
    }
    searchController.searchBar.barStyle = .Black
    searchController.searchBar.searchBarStyle = .Default
    searchController.searchBar.keyboardAppearance = .Dark
    searchController.searchBar.scopeButtonTitles = ["Title 1", "Title 2", "Title 3", "Title 3", "Title 3", "Title 3"]
    tableView.tableHeaderView = searchController.searchBar

首次加载UITableViewController时,搜索栏下方会显示范围栏并获取整个宽度: enter image description here

在搜索栏内触摸后,搜索栏旁边会显示范围栏: enter image description here

点击取消后,搜索栏会正确显示,下方没有范围栏,但搜索栏上的后续触摸仍会显示旁边的范围栏: enter image description here

我尝试过以下方法:

  • 将searchBarStyle从.Minimal更改为.Default
  • sizeToFit()searchBar上呼叫tableHeaderView,在viewDidLoad()和viewWillAppear()中尝试
  • searchBar
  • 中明确将tableHeaderViewviewWillAppear()的框架高度设置为88
  • proposed solutions here
  • 清除所有构建,清理和重建。

到目前为止,没有任何东西对外观或行为产生任何影响。我希望搜索栏下方的范围栏,并且它最初不会出现在搜索栏的后面。是UISearchController被破坏了还是我只是在做一些愚蠢的事情。

2 个答案:

答案 0 :(得分:1)

这是UISearchBar中的一个错误,你应该为它创建一个雷达。

解决方法是在设置scopeButtonTitles之后添加一些代码:

UIView *scopeBarContainer = [[[searchController.searchBar.subviews firstObject] subviews] firstObject];
for ( UIView *view in scopeBarContainer.subviews ) {
    if ( [view isKindOfClass:[UISegmentedControl class]] ) {
        scopeBarContainer.hidden = YES;
        break;
    }
}

答案 1 :(得分:0)

斯威夫特:

let scopeBarContainer: UIView? = searchController.searchBar.subviews.first?.subviews.first
if let _ = scopeBarContainer?.subviews.first(where: { $0.isKind(of: UISegmentedControl.self) } ) {
     scopeBarContainer?.isHidden = true
}