【问题标题】:UISearchBar presented by UISearchController in table header view animates too far when activeUISearchController 在表头视图中呈现的 UISearchBar 在活动时动画太远
【发布时间】:2015-04-04 06:19:40
【问题描述】:

我正在使用 UISearchController 在 tableview 的标题视图中显示搜索栏:

...
self.searchController.hidesNavigationBarDuringPresentation = NO;            
self.presentingTVC.tableView.tableHeaderView = self.searchController.searchBar;
[self.searchController.searchBar sizeToFit];
self.presentingTVC.tableView.tableHeaderView = self.searchController.searchBar;

(需要设置 tableHeaderView 属性两次,否则标题视图会与第一行重叠,c.f.a couple of answers on S.O.

这是它的外观,在不活动时完美定位:

搜索栏在活动时应该保持原位 - 我不希望它向上移动以隐藏导航栏。但它意外地动画下来,在它和导航栏之间留下了一个空白:

这是一个 video of weird search bar animation

如果我只使用独立于 UISearchController 的搜索栏,它在激活时不会显示相同的行为。

在我的展示视图控制器中,我有self.definesPresentationContext = YES;self.navigationController.navigationBar.translucent = YES;,并且在 IB 中没有一个“扩展边缘”框处于活动状态(所有似乎都可能导致搜索展示关闭的可能事情,从四处阅读) .

有谁知道如何阻止搜索栏向下动画?

【问题讨论】:

  • 我遇到了同样的问题。我尝试在这里浏览 Apple 的示例项目:developer.apple.com/library/ios/samplecode/…,但仍然没有运气。如果我找到答案会更新。
  • 没有一个解决方案对我有用:(
  • 您的视频链接现已损坏。
  • 现在应该修复了:)

标签: ios uitableview ios8 uisearchbar uisearchcontroller


【解决方案1】:

找到了!这似乎是当前 vc 的viewDidLoad 中的进攻路线:

self.edgesForExtendedLayout = UIRectEdgeNone;

删除了它,搜索栏按预期保持在原位。

【讨论】:

  • 这对我没有用,因为我的项目中没有此代码。我尝试使用另一个示例项目:github.com/dempseyatgithub/Sample-UISearchController 并将其逐个分解,但仍然没有运气。将继续搜索。
  • 嗯,烦人!您可以在情节提要的视图控制器上设置 edgesForExtendedLayout,也可以使用 Extend Edges 复选框。也许仔细检查一下?
  • 另外 - 我遇到了奇怪的动画,因为 UISearchController 现在是一个成熟的 VC - 例如,我看到一个奇怪的解雇动画,其中搜索栏会掉到底部单击取消时的 VC。这是由于呈现的 VC 提供了一个选择了垂直转换类型的转换上下文。总而言之,如果我能更好地理解表示机制的工作原理,我或许可以更轻松地调试所有这些怪异之处......!
  • 感谢您提供更多信息。我正在处理情节提要上的视图控制器复选框。我通过选中“在不透明条下”修复了滚动视图跳跃,但现在搜索控制器中表格的第一行被搜索栏隐藏。接近....
【解决方案2】:

好的,所以我终于找到了自己的解决方案。尽管我们的代码/故事板中很可能还有其他内容(这就是为什么这是一个很难回答的问题),但在大多数情况下,我还是遵循了 Apple 关于 UISearchController 的教程:(https://developer.apple.com/library/ios/samplecode/TableSearch_UISearchController/Introduction/Intro.html)

几乎我所有的代码都与他们的相同,但我无法让搜索栏在单击其中时不跳转。所以我所做的是在我的故事板中检查原始表视图和搜索结果表视图的“不透明条下”。这让搜索栏停止跳跃。

但最后一个问题是,结果表视图的第一行被搜索栏隐藏了。为了解决这个问题,我将self.tableView.contentInset = UIEdgeInsetsMake(kHeightOfTableViewCells, 0, 0, 0); 添加到我的结果表视图的viewDidLoad 方法中。瞧!

【讨论】:

  • 这里需要注意的是,'kHeightOfTableViewCells' 是我在表格视图类中设置的一个常量,用于定义单元格的高度。
  • 是的,我认为这已经到了某个地方! - 另见stackoverflow.com/a/19585104/2199136
  • 在情节提要的视图控制器上的不透明条下为我做了,谢谢!
  • 我最近将导航栏设置为不透明,这让导航栏跳了起来,这是多么疯狂的行为!
  • 谢谢!它有帮助。我想知道你是如何得到这个解决方案的?哦,我多么喜欢 TableView 中奇怪的跳跃或间隙,这可以通过模糊的布尔标志来防止......
【解决方案3】:

我能够通过从我的 ViewController 中删除以下行来防止 UISearchBar 向下移动: self.definesPresentationContext = YES;

【讨论】:

  • 绝妙的答案。这个想法是当混合有多个容器 VC 时,让根视图控制器作为搜索控制器的呈现器。通过不设置,我们回退到根视图控制器解决了从分离的父视图控制器发出的潜在问题。谢谢!
  • 起初它奏效了。但后来我注意到由于这个修复我发生了崩溃:如果我搜索并且没有结果,点击占位符中的按钮会导致“无选择器”类型的崩溃 - 按钮的 segue 不起作用。可能是我的设置的细节,但要小心。 self.definesPresentationContext = trueself.extendedLayoutIncludesOpaqueBars = true 的组合更适合我的设置。
【解决方案4】:

轮到我了。当我按照 WWDC 示例代码进行操作时,我也遇到了这个问题。

我注意到如果我没有设置 searchBar 的 scopeButtonTitles 属性,searchBar 将不可见。经过仔细检查,它只有一个 CGRectZero 框架。这意味着设置 scopeButtonTitles 设置幕后的框架。因此,如果不想显示任何 scopeButtonTitles,但仍不想将 UISearchBar 硬编码为特定高度,请将 scopeButtonTitles 设置为空数组。

self.searchController = UISearchController(searchResultsController: nil)
self.searchController.searchResultsUpdater = self
self.searchController.searchBar.scopeButtonTitles = []
self.tableView.tableHeaderView = self.searchController.searchBar

将 scopeButtonTitles 设置为 1 个字符串的数组将不会显示范围按钮标题,但仍有处理视图的逻辑,本质上是搞砸了布局。

对 Apple QA 团队的支持(适用于 iOS 8)

【讨论】:

  • 太棒了。适用于我在 iOS 8 上具有自定义行布局的 tableview!
  • 当您使用自定义视图控制器和您自己的表/集合视图时,为范围设置一个空数组肯定可以解决 iOS8 上的这个问题。
  • 您也可以拨打sizeToFit解决零尺寸问题。
【解决方案5】:

我最近遇到了这个问题,但没有一个解决方案对我有用。可能是因为我的 UI 更复杂(我的带有搜索支持的表格视图包含在 UiNavigationController 内的 UITabController 中)无论如何,上述工作人员都没有。 我可以通过在以下位置找到的这段非常简洁的代码来简单地解决我的问题: UISearchController Not Redisplaying Navigation Bar on Rotate

- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar
{
    if (bar == searchController.searchBar) {
        return UIBarPositionTopAttached;
    }
    else { // Handle other cases
        return UIBarPositionAny;
    }
}

还要补充一点:在将所有控制器的层次结构设置为在不透明栏和顶部栏下扩展后,我的搜索栏开始隐藏在导航栏下,并且会在旋转后立即出现可能发生。这对我来说是一个提示,即存在一些布局错误,并且与我的布局相关的一些信息不正确。这个委托方法可以帮助我的控制器了解其他游牧搜索栏的情况!

【讨论】:

    【解决方案6】:

    在我的例子中,将导航栏设置为self.navigationController.navigationBar.translucent = NO; 解决了这个问题。看来搜索栏展示层在布局搜索栏的时候没有考虑到导航栏的半透明。

    我意识到这不是一个完美的解决方案,因为导航栏的半透明可能会影响其他地方的布局,但它至少解决了可能存在非半透明导航栏的问题。

    【讨论】:

      【解决方案7】:

      老问题,但我能够通过设置解决这个问题

      self.extendedLayoutIncludesOpaqueBars = YES;

      在我的视图控制器上。我认为问题是由于导航栏不透明但在搜索控制器上将 hidesNavigationBarDuringPresentation 设置为 NO 引起的,导致搜索栏在聚焦时无法正确定位。

      【讨论】:

      • public var extendedLayoutIncludesOpaqueBars: Bool // Defaults to NO, but bars are translucent by default on 7_0. 所以我真的认为Apple应该默认设置为YES,因为iOS7
      • 这行得通。看起来其他解决方案是一种解决方法。
      • self.definesPresentationContext = YES; self.extendedLayoutIncludesOpaqueBars = YES; 的组合对我有用。
      • Garanda 的解决方案也适用于我,不同的是我在阅读 xml 中的故事板时在故事板中添加了这个 2。
      【解决方案8】:

      定义PresentationContext = true

      override func viewDidLoad() {
              super.viewDidLoad()
      
              searchController = UISearchController(searchResultsController: nil)
              searchController.searchResultsUpdater = self
              searchController.hidesNavigationBarDuringPresentation = false
      
              searchController.dimsBackgroundDuringPresentation = true
              searchController.searchBar.searchBarStyle = UISearchBarStyle.Prominent
              self.tableView.tableHeaderView = searchController.searchBar
      
              definesPresentationContext = true
      

      【讨论】:

      • 我也是! definesPresentationContext = true 就是生命!
      • 为我工作!在其他 segue 上,控制器表现良好,但在另一个堆栈上它正在消失。这解决了两个问题。
      【解决方案9】:

      我猜你设置了 UISearchBar frame.original.y = 64

      有代码

      if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) {
          [self setEdgesForExtendedLayout:UIRectEdgeNone];
      }
      
      searchBar.frame = CGRectMake(0, 0, 376, 44);
      

      洗可以帮你

      【讨论】:

        【解决方案10】:

        正如第一篇文章所述,每个人都需要不同的解决方案。所以这里是我的。我必须结合此页面上提到的两件事,即:

        斯威夫特 2:

            navigationController?.navigationBar.translucent = true
        
            edgesForExtendedLayout = .None
        

        【讨论】:

          【解决方案11】:

          取消选中调整滚动视图插图

          检查顶栏下

          已修复我的问题

          【讨论】:

          • 谢谢你!经过大量挖掘,这是唯一对我有用的解决方案。干杯!!你拯救了我的一天
          【解决方案12】:

          非常简单,只需添加女巫搜索栏中表格视图的标题视图的clipsToBounds = true即可。

          countryTableView.tableHeaderView?.clipsToBounds = true
          

          【讨论】:

            【解决方案13】:

            如果你使用 UINavigationControllerTabBar不能使用:

            self.extendedLayoutIncludesOpaqueBars = true
            

            你需要这个解决方案:https://stackoverflow.com/a/46151063/3369381

            【讨论】:

              【解决方案14】:

              对于 iOS 11 和 swift 4,在 viewController 中设置下面的行解决了我的问题(searchBar 跳下):

              self.edgesForExtendedLayout = .bottom
              

              【讨论】:

                【解决方案15】:

                我的是主控制器 .xib 文件中元素的顺序。

                这行得通。

                这不起作用。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-01-07
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-07-03
                  • 1970-01-01
                  • 2015-12-17
                  相关资源
                  最近更新 更多