【问题标题】:Show search bar in navigation bar without scrolling on iOS 11在导航栏中显示搜索栏而不在 iOS 11 上滚动
【发布时间】:2018-02-24 15:56:51
【问题描述】:

我在 iOS 11 上将 UISearchController 附加到 UITableViewController 的 navigationItem.searchController 属性。这很好用:我可以使用漂亮的 iOS 11 风格的搜索栏。

但是,我想让搜索栏在启动时可见。默认情况下,用户必须在表格视图中向上滚动才能看到搜索栏。有谁知道这怎么可能?

左:启动后的默认情况。右:搜索栏可见(通过向上滚动)。我希望搜索栏在启动后可见,如右侧屏幕截图所示。

我已经发现可以通过将导航项的属性hidesSearchBarWhenScrolling 设置为false 来使搜索栏可见。但是,这会导致搜索栏始终可见——即使向下滚动也是如此——这不是我想要的。

【问题讨论】:

  • 在你添加代码的地方hidesSearchBarWhenScrolling
  • 设置成sfirstResponder怎么样?
  • 下面选择的答案在加载时适用于我,但我还想在使用scrollView.setContentOffset(_:animated) 以编程方式滚动到顶部时重新显示搜索控制器。有人有建议吗?
  • @Jonathan hidesSearchBarWhenScrolling = false 在 iOS 13 中将搜索栏放在大标题上。知道我是否可以以某种方式更新它吗?

标签: ios uinavigationitem uisearchcontroller


【解决方案1】:

将searchController添加到navigationItem后,可以将属性isActive设置为true

就像这样:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    searchController.isActive = true
}

【讨论】:

  • 没有setter方法'setIsActive:'
  • 你是对的,@NikolayKrasnov。 isActive 是一个只读布尔值。你会想要使用searchController.active = true,而不是。
【解决方案2】:

以下内容首先使搜索栏可见,然后在滚动时使其隐藏:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    if #available(iOS 11.0, *) {
        navigationItem.hidesSearchBarWhenScrolling = false
    }
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    if #available(iOS 11.0, *) {
        navigationItem.hidesSearchBarWhenScrolling = true
    }
}

使用isActive 并没有达到我想要的效果,它使搜索栏处于活动状态(显示取消按钮等),而我只想让它可见。

【讨论】:

  • 谢谢,为我工作。不过有趣的解决方案:)
  • 此解决方案有效,但如果您还显示以前隐藏的导航栏(即将此视图与搜索栏推到导航堆栈上),则会有副作用搜索栏将显示为静态在导航栏动画的地方。看起来很糟糕:(
  • 如果您将第一部分放在viewDidLoad 而不是viewWillAppear 中,则不会
  • 有人可以详细说明为什么这有效,为什么 viewDidLoad 中的searchController.searchBar.isHidden = false 无效?后者对我来说似乎更合乎逻辑
  • 这会导致 iOS 13 在从子屏幕返回时出现视觉错误。
【解决方案3】:

对我来说,在 viewDidLoad() 方法中添加以下几行后它就起作用了:

navigationController?.navigationBar.prefersLargeTitles = true
navigationController!.navigationBar.sizeToFit()

【讨论】:

    【解决方案4】:

    在 iOS 13 上,@Jordan Wood 的回答不起作用。 相反,我做了:

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        UIView.performWithoutAnimation {
            searchController.isActive = true
            searchController.isActive = false
        }
    }
    

    【讨论】:

      【解决方案5】:
      For (iOS 13.0, *) and SwiftUI
      

      navigationController?.navigationBar.sizeToFit()

      Example:
      
      struct SearchBarModifier: ViewModifier {
              let searchBar: SearchBar
              func body(content: Content) -> some View {
              content
                  .overlay(
                      ViewControllerResolver { viewController in
                          viewController.navigationItem.searchController = self.searchBar.searchController
                          viewController.navigationController?.navigationBar.sizeToFit()
      
                      }
                      .frame(width: 0, height: 0)
                  )
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-10
        • 2018-03-12
        • 2018-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-02
        • 2018-05-03
        相关资源
        最近更新 更多