【问题标题】:iOS 9 searchBar disappears from table header view when UISearchController is active当 UISearchController 处于活动状态时,iOS 9 searchBar 从表头视图中消失
【发布时间】: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

标签: ios swift uisearchbar ios9 uisearchcontroller


【解决方案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
                }
            
            
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-07-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-01-03
              • 2016-06-23
              相关资源
              最近更新 更多