繁体   English   中英

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

[英]Refresh Control with Search Display Controller appears overtop the Search Bar

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

问题是,当搜索栏位于搜索栏下方时,它可以在搜索栏的顶部看到。

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

当你慢慢拉下来时,你会看到第一行显示在搜索栏的上方,如下所示: 在此输入图像描述

如果你继续拉动,它会显示在你期望的位置,但是如果你在视图仍然刷新的同时将视图重新推回,你会在搜索栏顶部看到微调器,如下所示: 在此输入图像描述

一旦你将它向上推,使得微调器触及第一节头,旋转器立即消失。

这就是它应该看起来的样子,就像在Mail中一样 - 位于搜索栏下方: 在此输入图像描述

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

self.refreshControl.layer.zPosition = self.searchDisplayController.searchBar.layer.zPosition - 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!
    }
}

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

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

refreshControl.layer.zPosition -= 1

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

[self.view addSubview:self.refreshControl];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM