当UISearchController处于活动状态时,iOS 9 searchBar从表头视图中消失
结构:
View1(点击一个button) – >现在模态(MyModalView:UITableViewController)
MyModalViewembedded了UISearchController。 UISearchController的searchBar放置在MyModalView.tableView.tableHeaderView中。
从iOS 8.0开始,它一直在正常工作。 但是,在iOS 9上,当UISearchController处于活动状态时,searchBar会消失。 请看下面的这些照片
模态观点:
UISearchController在iOS 8上处于活动状态:
UISearchController在iOS 9上处于活动状态:
非常标准的代码:
override func viewDidLoad() { super.viewDidLoad() // Dynamically create a search controller using anonymous function self.resultSearchController = ({ let controller = UISearchController(searchResultsController: nil) controller.searchResultsUpdater = self controller.dimsBackgroundDuringPresentation = false controller.searchBar.sizeToFit() controller.searchBar.delegate = self self.tableView.tableHeaderView = controller.searchBar return controller })() // Auto sizing row & cell height self.tableView.estimatedRowHeight = 130 self.tableView.rowHeight = UITableViewAutomaticDimension self.definesPresentationContext = true // No footer for better presentation self.tableView.tableFooterView = UIView.init(frame: CGRectZero) }
这个问题也发生在iOS 9.1 beta …
任何想法/指针将深受赞赏
干杯。
我不确定究竟是什么问题,但我通过以下方法“修复”:
self.searchController.hidesNavigationBarDuringPresentation = NO; self.definesPresentationContext = NO;
我的猜测是,当UISearchController
试图呈现为导航栏时,它正在做一些有趣的事情。 所以,这是一个黑客,但至less不会阻止用户。 search栏不会做很酷的animation,并遮住导航栏。
看起来我们大家都有同样的问题,但他们以不同的方式解决。 然而,没有build议的答案为我工作:(尽pipe如此,谢谢大家的时间。
我有一个解决scheme,解决了我的问题。 它使用界面生成器将“我的(MyModalView:UITableViewController)”的“不透明条”下的“延伸边”设置为“真”。
综上所述:
MyModalView:UITableViewController,在使用Interface Builder的Storyboard中有
延伸边缘: – 在顶部酒吧勾选 – 在底部酒吧勾选 – 在不透明酒吧勾选
我发现这是故事板中的模拟指标(顶部栏),导致了这个问题。 在我的情况下,以下线路工作,但我仍然不知道为什么。
- (void)willPresentSearchController:(UISearchController *)searchController { // do something before the search controller is presented self.navigationController.navigationBar.translucent = YES; } -(void)willDismissSearchController:(UISearchController *)searchController { self.navigationController.navigationBar.translucent = NO; }
我不得不
self.aNavigationController?.extendedLayoutIncludesOpaqueBars = true
我在这里发现了一个类似的问题,但在我的情况下,它不是在viewDidLoad方法。 我必须尝试不同的意见,直到它的工作。 现在我可以同时拥有自定义的导航栏颜色和search栏,
谢谢@wiles段和@Techprimate
在我的情况下,我通过设置:
self.definesPresentationContext = NO;
并在UISearchControllerDelegate中实现以下2个方法
- (void)willPresentSearchController:(UISearchController *)searchController { // do something before the search controller is presented self.navigationController.navigationBar.translucent = YES; } -(void)willDismissSearchController:(UISearchController *)searchController { self.navigationController.navigationBar.translucent = NO; }
我通过删除在我的情况下固定它
definesPresentationContext = true
我还没有testing,如果有任何消除这个缺点!
我在这个应用程序的地方没有导航栏。 没有其他SOpost帮助了我,所以我已经解决了这个问题:
- (void)layoutSubviews { [[[self searchController] searchBar] sizeToFit]; }
设置导航条永久在故事板半透明解决了我的问题。
有用
override func viewDidLoad() { super.viewDidLoad() self.extendedLayoutIncludesOpaqueBars = !self.navigationController!.navigationBar.translucent }
我有同样的问题,当我在Xcode上debuggingUI时,我发现UISearchBar
视图被移动到另一个视图,宽度为零。
我通过将UISearchController
definesPresentationContext
属性设置为false
来修复它,并将其设置为包含UITableViewController
。
我只添加了一行到你的viewDidLoad()
。
override func viewDidLoad() { super.viewDidLoad() // Dynamically create a search controller using anonymous function self.resultSearchController = ({ let controller = UISearchController(searchResultsController: nil) controller.searchResultsUpdater = self controller.dimsBackgroundDuringPresentation = false controller.definesPresentationContext = false // Disable the presentation controller controller.searchBar.sizeToFit() controller.searchBar.delegate = self self.tableView.tableHeaderView = controller.searchBar return controller })() // Auto sizing row & cell height self.tableView.estimatedRowHeight = 130 self.tableView.rowHeight = UITableViewAutomaticDimension self.definesPresentationContext = true // This one remains the same // No footer for better presentation self.tableView.tableFooterView = UIView.init(frame: CGRectZero) }
如果你想隐藏你的导航栏,并显示search控制器全屏,在导航栏上设置以下内容,search栏不会消散:
navigationController?.navigationBar.translucent = true