【问题标题】:UISearchController with UIBarPositionTopAttached throws UISearchBar offscreen; impossible to have standard UISearchController with UITableView?带有 UIBarPositionTopAttached 的 UISearchController 将 UISearchBar 抛出屏幕外;不可能有标准的 UISearchController 和 UITableView?
【发布时间】:2015-10-08 20:42:20
【问题描述】:

我正在尝试创建与 iOS 8 中的联系人应用类似的体验。其主要组成部分是:

  1. 将搜索栏固定在导航栏下方
  2. 在展示时将搜索栏附加到视图顶部(标准功能)。

然而,这说起来容易做起来难。在与tableHeaderView(不允许在表格视图前进行交互,并且与viewDidLayoutSubviews 定位很复杂)斗争一段时间之后,我决定在UIViewController 中嵌入UITableView,所以我可以将UISearchBar 添加为子视图。这工作得很好,并且允许在所有滚动位置与搜索栏进行交互,并且插图不难计算。

但是,当激活时,状态栏下方的搜索栏会被截断。 似乎是一个直截了当的问题——即使我没有经历过 完全相同的实现 em> 在UITableViewController。因此,我尝试确保在每个可能的视图控制器中我的所有属性都设置为对齐。

self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = YES;
self.automaticallyAdjustsScrollViewInsets = NO;

我已经尝试了所有可能的组合,包括 viewWillAppear 和 viewDidLoad,以及半透明导航栏和表格视图和搜索栏的不同起始帧。没有运气。因此,我尝试调整框架或约束,可能使用 topLayoutGuide 或仅使用 0。不幸的是,在任何 UISearchControllerDelegate 方法中调整框架实际上并没有调整其呈现的位置,并且在活动动画开始时添加约束立即崩溃(由于当时视图层次结构中不存在 super.top;删除 willPresent 中的约束绝对没有任何作用)。

在挣扎了一段时间后,我尝试将positionForBar 实现为UISearchBar 的代表:

- (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar {
    return UIBarPositionTopAttached;
}

这似乎调整了高度,但搜索栏飞离了视图的顶部。激活后,搜索栏似乎直接出现在可见区域的上方 .这甚至比它被夹在UIStatusBar 后面或下面更糟糕。我还尝试在搜索控制器激活时隐藏状态栏,但有条件地实现prefersStatusBarHidden 根本不起作用(在没有UISearchController 活动的情况下返回YES 效果很好,但是当活动时它再次显示状态栏或显示在其下方)。我认为这是因为UISearchController 拒绝遵守任何标准或规则,这一点现在非常清楚。

这几天我一直在尝试解决这个问题,除了完全重新实现 UISearchController 类/动画之外,我想不出解决方案。请帮忙!

【问题讨论】:

    标签: ios objective-c uitableview uiviewcontroller uisearchcontroller


    【解决方案1】:

    我的理解是,如果你需要导航栏下的搜索栏,就像你在#1 中提到的那样,它很容易设置一个布尔值(#1 的解决方案)searchController.hidesNavigationBarDuringPresentation = true

    很遗憾,当导航栏隐藏时,我无法修复搜索栏屏幕外问题。

    【讨论】:

      【解决方案2】:

      我也有同样的问题。我将UISearchController 添加到UIViewController,而不使用tableView.header。 UISearchBar.superview.frame.origin.y 是 -44。所以你看不到searchBar。

      方法一:你可以在didPresentSearchControllerUISearchControllerDelegate的代理中改变UISearchBarWrapperView的框架。但是你会看到这个过程的动画。

      方法2:就像JBlake说的。在UISearchController 之后设置self.definesPresentationContext = YES;init。有效!

      【讨论】:

        【解决方案3】:

        对我有用的是子类化 UISearchController 并覆盖子类中的 prefersStatusBarHidden

        还要确保基于视图控制器的状态栏外观设置为YES

        在包含 tableview / 搜索栏的 viewcontroller 中:

        self.definesPresentationContext = YES;
        

        【讨论】:

          【解决方案4】:

          对于您描述的行为,这对我很有用?

          var resultSearchController = UISearchController()
          

          在你的 viewDidLoad 函数中有以下内容:

          //Search Bar
                  self.resultSearchController = ({
                      let controller = UISearchController(searchResultsController: nil)
                      controller.searchResultsUpdater = self
                      controller.searchBar.sizeToFit()
                      controller.dimsBackgroundDuringPresentation = false
          
                      self.tableView.tableHeaderView = controller.searchBar
                      self.definesPresentationContext = true
                      return controller
                  })()
          

          【讨论】:

          • 感谢您的回复!不幸的是,虽然这个实现效果很好,但它不能满足我的要求(问题顶部的#1 和#2)。即使在滚动时,我也需要搜索栏保持固定。
          • @insanj 您是否尝试将搜索栏的框架设置为视图中的 y 翻译滚动?
          • 不,这在这种情况下没有意义。我已经将搜索栏直接添加为子视图,表格视图之上。如果它是tableHeaderView,那可能是有道理的,但无论如何该解决方案都不完美(触摸通过)。如果您可能指的是搜索结果表视图的 y 平移,那似乎也太迟了:最后,我需要在任何滚动之前进行框架调整(它在任何搜索之前变暗,直到搜索是完整的(标准UISearchController),并且没有发生 didScroll)。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-01
          • 1970-01-01
          相关资源
          最近更新 更多