iOS9 范围栏出现在搜索栏后面或旁边
iOS9 Scope Bar appears either behind or beside Search Bar
我有一个自定义 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 首次加载时,范围栏在搜索栏下方可见并占据整个宽度:
点击搜索栏内部后,范围栏显示在搜索栏旁边:
点击取消后,搜索栏正确显示,下面没有范围栏,尽管搜索栏上的后续触摸仍然显示其旁边的范围栏:
我试过以下方法:
- 将 searchBarStyle 从 .Minimal 更改为 .Default
- 在
searchBar
和 tableHeaderView
上调用 sizeToFit()
,在 viewDidLoad() 和 viewWillAppear() 中都尝试过
- 在
viewWillAppear()
中将 searchBar
和 tableHeaderView
的帧高度显式设置为 88
- proposed solutions here
- 正在清除所有构建、清理和重建。
到目前为止,外表或行为没有任何不同。我想要搜索栏下方的范围栏,并且它最初不会出现在搜索栏后面。 UISearchController
是被破坏了还是我只是在做一些愚蠢的事情。
这是 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;
}
}
Swift :
let scopeBarContainer: UIView? = searchController.searchBar.subviews.first?.subviews.first
if let _ = scopeBarContainer?.subviews.first(where: { [=10=].isKind(of: UISegmentedControl.self) } ) {
scopeBarContainer?.isHidden = true
}
我有一个自定义 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 首次加载时,范围栏在搜索栏下方可见并占据整个宽度:
点击搜索栏内部后,范围栏显示在搜索栏旁边:
点击取消后,搜索栏正确显示,下面没有范围栏,尽管搜索栏上的后续触摸仍然显示其旁边的范围栏:
我试过以下方法:
- 将 searchBarStyle 从 .Minimal 更改为 .Default
- 在
searchBar
和tableHeaderView
上调用sizeToFit()
,在 viewDidLoad() 和 viewWillAppear() 中都尝试过 - 在
viewWillAppear()
中将 - proposed solutions here
- 正在清除所有构建、清理和重建。
searchBar
和 tableHeaderView
的帧高度显式设置为 88
到目前为止,外表或行为没有任何不同。我想要搜索栏下方的范围栏,并且它最初不会出现在搜索栏后面。 UISearchController
是被破坏了还是我只是在做一些愚蠢的事情。
这是 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;
}
}
Swift :
let scopeBarContainer: UIView? = searchController.searchBar.subviews.first?.subviews.first
if let _ = scopeBarContainer?.subviews.first(where: { [=10=].isKind(of: UISegmentedControl.self) } ) {
scopeBarContainer?.isHidden = true
}