使用搜索显示控制器的刷新控制显示在搜索栏的上方

时间:2014-06-17 17:37:37

标签: ios objective-c uitableview uisearchdisplaycontroller uirefreshcontrol

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

问题是,当搜索栏位于搜索栏下方时,微调器可见。

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

当你慢慢拉下来时,你会看到第一行显示在搜索栏的上方,如下所示: enter image description here

如果你继续拉,它会显示在你期望的位置,但是如果你在视图仍然刷新时将视图重新向上移动,你会在搜索栏顶部看到微调器,如下所示: enter image description here

一旦将其向上推,使得微调器接触到第一节标题,微调器立即消失。

这就是它应该在搜索栏下面看起来的样子,就像在Mail中一样: enter image description here

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

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

如何在使用最小样式时阻止微调器出现在搜索栏的顶部?

4 个答案:

答案 0 :(得分:3)

要解决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!
    }
}

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

refreshControl.layer.zPosition -= 1

答案 3 :(得分:-1)

因此,如果它可以帮助任何人我遇到同样的问题并且快速解决方案是将refreshcontrol添加为self.view的子视图而不是tableheaderview。这将把控制器添加到其他所有东西之上,并且你可以看到它。另一方面,我相信你可以完全纠正y在正确的layer.zPosition下设置它。但我没有时间完全纠正它。

[self.view addSubview:self.refreshControl];