当 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 视图被移动到另一个视图并且宽度被归零了。

我通过将UISearchControllerdefinesPresentationContext 属性设置为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 在选项卡栏中崩溃,“只有一个带有顶部边界的调色板可以在过渡之外处于活动状态”