拉动时 UIRefreshControl 下面的白线.. tableView

White line below UIRefreshControl when pulled.. tableView

我正在实现一个非常基本的刷新控件...

    var refreshControl = UIRefreshControl()
    refreshControl.addTarget(self, action: Selector(("refresh:")), for: UIControlEvents.valueChanged)
    refreshControl.backgroundColor = UIColor.red
    self.tableView.addSubview(refreshControl)

出于某种原因,但每当我下拉刷新时,刷新控件似乎无法跟上 table 视图,并且两者之间存在空白。

这是模拟器上的问题...我相信 iPhone 上更糟

http://gph.is/2ijyH26

为什么要添加 refreshControl 作为子视图?你必须这样做:

refreshControl.addTarget(self, action: #selector(refresh), for: .valueChanged)
tableView.refreshControl = refreshControl

虽然我也建议您按照 Artem 发布的内容进行操作,但它并没有直接为我消除差距。结果我 运行 遇到了与 UIRefreshControl 相关的 2 个不同问题,并找到了一些 'hacks' 来解决它们。简单的解决方法是将 table 视图的背景色设置为与刷新控件相同的颜色,但这样做的副作用是在 table 视图的底部看到相同的颜色。

我的设置是一个 UINavigationController 托管一个 UIViewController,一个 UITableView 子视图和一个 UISearchBar 设置为 table 视图的 table标题视图。我的目标是匹配导航栏、刷新控件和搜索栏的颜色。

第 1 期

我认为这与您遇到的问题相同。似乎只要您拖动以启动拉动以刷新操作,在手势的前几个点就会出现间隙。在某个阈值之后,刷新控件变为正确的颜色。但是,在返回 table 视图的静止滚动状态的途中,我们再次看到相同的间隙,就在它到达内容偏移量 0 之前。这是它的样子:

解决方案 1

如果您将 UIRefreshControl 子类化并覆盖 frameisHidden 属性,并在设置它们时打印出它们的值,您会注意到刷新控件不会实际上直到与 table 视图顶部的距离为 4pt 时才会隐藏。同样,当您向下滚动时,您还会看到它被设置为隐藏在同一位置周围,这是在您无法再看到刷新控件之前以及为什么我们看到缝隙偷看 table查看背景。

在我们的子类中,我们可以通过覆盖 isHidden 的 setter 和 getter 以及 [= frame 的 21=] 仅在刷新控件的偏移量实际为 0 时隐藏。

class RefreshControl: UIRefreshControl {

    override var isHidden: Bool {
        get {
            return super.isHidden
        }
        set(hiding) {
            if hiding {
                guard frame.origin.y >= 0 else { return }
                super.isHidden = hiding
            } else {
                guard frame.origin.y < 0 else { return }
                super.isHidden = hiding
            }
        }
    }

    override var frame: CGRect {
        didSet {
            if frame.origin.y < 0 {
                isHidden = false
            } else {
                isHidden = true
            }
        }
    }
}

我称之为 hack,因为我不太喜欢修改 UIRefreshControl 的现有行为,但我还没有找到更好的方法来解决这个问题。

第 2 期

在问题 1 中拉动刷新超过该间隙阈值时,UIRefreshControl 的框架似乎跟不上搜索栏。这给了我们另一种跟随搜索栏的差距。这是它的样子:

解决方案 2

这个滞后的差距看起来帧的更新速度不如我们的滚动甚至动画。事实证明,如果我们在 layoutSubviews 之类的地方将框架设置为自身,我们会得到以下行为:

override func layoutSubviews() {
    super.layoutSubviews()
    var originalFrame = frame
    frame = originalFrame
}

同样,这很老套,但我也没有找到其他方法来解决这个问题。

结果