带有搜索显示控制器的刷新控件出现在搜索栏上方

Posted

技术标签:

【中文标题】带有搜索显示控制器的刷新控件出现在搜索栏上方【英文标题】:Refresh Control with Search Display Controller appears overtop the Search Bar 【发布时间】:2014-06-17 17:37:36 【问题描述】:

我已经实现了一个简单的表格视图控制器,其中搜索显示控制器通过界面生成器拖出。然后我启用了刷新,以便在用户下拉刷新时可以看到刷新控件。

问题是,当微调器应该位于搜索栏下方时,它却在搜索栏顶部可见。

我知道原因是最小搜索样式。如果使用默认的 Prominent 样式,则问题不存在。

当您慢慢下拉时,您会看到第一行出现在搜索栏上方,如下所示:

如果你继续拉它,它确实会显示在你期望的位置,但是如果你在它仍然刷新的时候将视图推回,你会在搜索栏顶部看到微调器,如下所示:

只要将它向上推,使微调器接触到第一节标题,微调器就会立即消失。

这是它应该看起来的样子,就像它在 Mail 中一样 - 在搜索栏下方:

我试图通过简单地将微调器放在搜索栏下方来解决此问题,这样它就不会出现在顶部,但这不起作用。奇怪的是,该代码导致微调器在表格上方的灰色区域中不可见,如果将其向上推,它会出现在搜索栏上方 - 与我的预期完全相反。这是代码:

self.refreshControl.layer.zPosition = self.searchDisplayController.searchBar.layer.zPosition - 1;

如何在使用 Minimal 样式时防止微调器出现在搜索栏顶部?

【问题讨论】:

我认为 Andrew 的问题是你没有向我们展示如何你是如何用你的代码实现这些变体的,所以很难指出任何可能除了编写关于视图如何显示、堆叠和交互的完整教程之外,这是一个有效的解决方案。只是含糊地说“我这样做”是不够的信息。 重现问题不需要代码。一行代码试图解决这个问题。我说明了遇到问题所需的一切:在 IB 中拖出一个表格视图控制器,添加一个搜索显示控制器,在侧边栏中启用刷新,运行应用程序。通过变体,我相信您是指提供的不同屏幕截图?人们可以通过在屏幕上拖动手指来查看该行为。我没有对这种行为进行编码。 您是否尝试将 z 位置设置为负数,即 -1?如果那些其他组件使用 Z 位置,那么最好测试一下,看看两者之间的分层是否混乱 @theMonster 谢谢,但将其更改为 -1 会导致微调器根本不出现,除非它位于搜索栏上方 - 与我之前尝试的代码相同。 【参考方案1】:

要解决UISearchBarStyleMinimal 的此错误,您必须为任何图像设置backgroundImage 属性。只有设置了背景图片,布局才会正确。

private extension UISearchBar 
    private func setBackgroundColorWithImage(color: UIColor) 
        let rect = self.bounds
        UIGraphicsBeginImageContext(rect.size)
        let context = UIGraphicsGetCurrentContext()
        CGContextSetFillColorWithColor(context, color.CGColor)
        CGContextFillRect(context, rect);

        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        self.backgroundImage = image // here!
    

【讨论】:

你能用 Objective C 写这段代码吗? @Marcin【参考方案2】:

这似乎是 Minimal Bar Style 的一个错误。如果您将其设置为 Prominent,您将不会遇到此问题。如果您使用 Prominent 并尝试删除背景,您也会遇到此问题。我发现的唯一解决方法是尝试模仿 Minimal 样式并应用 Prominent 样式。

【讨论】:

【参考方案3】:

设置时将刷新控件移到搜索栏后面。

refreshControl.layer.zPosition -= 1

【讨论】:

【参考方案4】:

因此,如果它对我遇到相同问题的任何人有所帮助,并且一个快速的解决方案是将刷新控件添加为 self.view 的子视图,而不是 tableheaderview。这会将控制器添加到其他所有内容之上,至少您将能够看到它。另一方面,我相信您可以在正确的 layer.zPosition 下完全纠正 y 设置。但是我没有时间完全纠正它。

[self.view addSubview:self.refreshControl];

【讨论】:

viewDidLoad 中添加该代码对我不起作用,即使我首先将其从其superview 中删除。它仍然出现在搜索栏上方。你还需要做什么吗?

以上是关于带有搜索显示控制器的刷新控件出现在搜索栏上方的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法可以在 shaka 控制面板上方显示搜索栏

在带有分段控件的 UITabBarController 中模态显示导航视图控制器

使用搜索栏和大标题导航栏拉刷新问题

模态视图导航栏未正确显示

UISearchBar 在解雇后正在调整大小

使用隐藏的导航栏刷新控件