当 UISearchController 处于活动状态时,iOS 9 searchBar 从表头视图中消失
Posted
技术标签:
【中文标题】当 UISearchController 处于活动状态时,iOS 9 searchBar 从表头视图中消失【英文标题】:iOS 9 searchBar disappears from table header view when UISearchController is active 【发布时间】:2015-12-17 16:22:12 【问题描述】:结构:
View1(单击按钮)-> 模态显示(MyModalView: UITableViewController)
MyModalView 嵌入了 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 中......
任何想法/指针将不胜感激
干杯。
【问题讨论】:
对我来说,这只发生在设备上(不在模拟器中)。 嗨@IanDundas 我在下面发布了我的答案你想试试看它是否能解决你的问题? 是的,实际上@Shwethascar 修复了它很幸运 - 不过还是谢谢。只是为其他人添加一些上下文,它只发生在我的实际设备上。 试试 searchController.hidesNavigationBarDuringPresentation = false 【参考方案1】:我不确定到底是什么问题,但我通过以下方式“修复”了它:
self.searchController.hidesNavigationBarDuringPresentation = NO;
self.definesPresentationContext = NO;
我的猜测是UISearchController
在尝试显示为导航栏时正在做一些时髦的事情。所以,这是一个黑客,但它至少不会阻止用户。搜索栏没有做炫酷的动画并掩盖了导航栏。
【讨论】:
只需要第一行searchController.hidesNavigationBarDuringPresentation = false
(swift)
是的,只需要searchController.hidesNavigationBarDuringPresentation = false,这才是真正的解决方案。
不,不是一个真正的解决方案。如果我们需要隐藏导航栏并且 SearchBar 隐藏在状态栏下..?
这两样我都需要
这应该是公认的答案。这是唯一对我有用的东西。谢谢。【参考方案2】:
似乎我们所有人都遇到了同样的问题,但他们以不同的方式解决了。然而,没有一个建议的答案对我有用:(。不过,谢谢大家的时间。
我得到了解决我的问题的解决方案。它使用 Interface Builder 在 Storyboard 中将 Extend Edges - Under Opaque Bars of my (MyModalView: UITableViewController) 设置为 true。
总结:
MyModalView:UITableViewController,在Storyboard中使用Interface Builder有
延伸边缘: - 在顶栏下打勾 - 在底栏下打勾 - 在不透明条下打勾
【讨论】:
是的。延伸边缘: - 在情节提要中勾选的不透明条下起到了作用。 这已经困扰了我好几个小时了。非常感谢。 这些复选框对应哪些属性?很多人不使用 Interface Builder。【参考方案3】:我发现是故事板中的模拟指标(顶栏)导致了这个问题。 就我而言,以下几行有效,但我仍然不知道为什么。
- (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;
【讨论】:
即使使用纯代码也会发生这种情况。我敢打赌 translucent = false 实际上会删除视图或其他内容,而不是禁用半透明效果,因此搜索栏只是超出了可见区域 不要忘记将 searchController 委托设置为实现这些方法的类(通常是 self) 这是使它对我有用的解决方案!谢谢!searchController.searchBar.searchBarStyle = .default
in willPresent
和 .minimal
in willDismiss
对我有帮助。
也解决了我们的问题 - 在我们的例子中,导航栏与搜索栏重叠 - 在代表内部将半透明设置为开/关解决了问题。【参考方案4】:
我不得不
self.aNavigationController?.extendedLayoutIncludesOpaqueBars = true
我发现了一个类似的问题here,但就我而言,它不在 viewDidLoad 方法上。我不得不尝试不同的观点,直到它奏效。现在我可以同时拥有自定义导航栏颜色和搜索栏了,
【讨论】:
伟大的答案 Jigzat ! 这应该与@David Trang 答案一起添加。【参考方案5】:感谢@wiles duan 和@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;
【讨论】:
我通过实现委托方法修复了我的问题【参考方案6】:我在我的情况下通过删除修复它
definesPresentationContext = true
我还没有测试删除它是否有任何缺点!
【讨论】:
添加这个为我修复了它。 ?【参考方案7】:我遇到了同样的问题,当我在 Xcode 上调试 UI 时,我发现 UISearchBar
视图被移动到另一个视图并且宽度被归零了。
我通过将UISearchController
的definesPresentationContext
属性设置为false
来修复它,并将其设置为true
用于包含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)
【讨论】:
【参考方案8】:我在应用程序的这个地方没有导航栏。其他 SO 帖子都没有帮助我,所以我用这种方式修复了它:
- (void)layoutSubviews
[[[self searchController] searchBar] sizeToFit];
【讨论】:
【参考方案9】:在故事板中将导航栏永久设置为半透明解决了我的问题。
【讨论】:
【参考方案10】:有效
override func viewDidLoad()
super.viewDidLoad()
self.extendedLayoutIncludesOpaqueBars = !self.navigationController!.navigationBar.translucent
【讨论】:
我必须在 viewDidAppear 中执行此操作,否则它会以某种方式再次中断。谢谢@Apple。 这也为我修复了它。谢谢【参考方案11】:如果您想隐藏导航栏,并全屏显示搜索控制器,请在导航栏上设置以下内容,搜索栏不会消失:
navigationController?.navigationBar.translucent = true
【讨论】:
【参考方案12】:sc.hidesNavigationBarDuringPresentation = false
对我有用
lazy var searchController:UISearchController =
let sc = UISearchController(searchResultsController: nil)
sc.searchResultsUpdater = self
sc.obscuresBackgroundDuringPresentation = false
sc.searchBar.placeholder = "Search"
sc.hidesNavigationBarDuringPresentation = false
return sc
()
【讨论】:
【参考方案13】:它们都不适合我,我用这个 hack 修复了它
func position(for bar: UIBarPositioning) -> UIBarPosition
if UIDevice.current.userInterfaceIdiom == .pad
return .top
else
if iOSVersion <= 9
return .top
return .topAttached
【讨论】:
以上是关于当 UISearchController 处于活动状态时,iOS 9 searchBar 从表头视图中消失的主要内容,如果未能解决你的问题,请参考以下文章
当 UISearchController 处于活动状态并选择新选项卡时,UITableView 消失
当 UISearchController 处于活动状态时,iOS 9 searchBar 从表头视图中消失
在 UISearchController 处于活动状态时选择 tableview 中的单元格,不显示下一个视图?
UISearchController 不会停留在表头视图的顶部
带有大标题的 UISearchController 在选项卡栏中崩溃,“只有一个带有顶部边界的调色板可以在过渡之外处于活动状态”