拉下UIRefreshControl下面的白线.. tableView

use*_*406 4 uitableview ios uirefreshcontrol swift3

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

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

出于某种原因,虽然每当我下拉刷新它就像刷新控件无法跟上表视图并且两者之间存在白色差距.

这是模拟器上的问题...我认为它在iPhone上更糟糕

http://gph.is/2ijyH26

Cai*_*pia 12

虽然我也建议你应该做Artem发布的内容,但它并没有直接消除我的差距.事实证明,我UIRefreshControl遇到了两个与之相关的不同问题,并发现了一些"黑客"来绕过它们.简单的解决方法是将tableView的背景颜色设置为与刷新控件相同的颜色,但这会产生副作用,即在表视图的底部看到相同的颜色.

我设立一个UINavigationController托管UIViewControllerUITableView子视图和一UISearchBar组作为的tableView的tableHeaderView.我的目标是匹配导航栏,刷新控件和搜索栏的颜色.

问题1

我认为这与您所看到的问题相同.看起来,只要你拖动开始拉动刷新动作,就会在手势的前几个点出现间隙.在某个阈值之后,刷新控件变为正确的颜色.在回到表视图的静止滚动状态的路上,我们在它到达内容偏移量0之前再次看到相同的间隙.这是看起来像:

UIRefreshControl闪烁的差距

解决方案1

如果您子类化UIRefreshControl并覆盖frameisHidden属性并在设置它们时只打印它们的值,您会注意到刷新控件实际上不会被取消隐藏,直到距离表格顶部的距离为4pt.类似地,当您向下滚动时,您还会看到它被设置为隐藏在同一位置周围,这是在您无法再看到刷新控件之前以及为什么我们看到间隙窥视tableView背景之前.

在我们的子类,我们可以防止这个"早"隐藏和"晚"通过重写setter和吸气剂取消隐藏isHiddendidSetframe只有躲偏移时更新控制的实际上是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
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我称之为黑客,因为我不是修改UIRefreshControl现有行为的忠实粉丝,但我还没有找到更好的解决方法.

问题2

当在第1期中提取超过该缺口阈值时,似乎UIRefreshControl的框架无法跟上搜索栏.这给了我们另一种跟随搜索栏的差距.这就是它的样子:

UIRefreshControl滞后

解决方案2

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

override func layoutSubviews() {
    super.layoutSubviews()
    var originalFrame = frame
    frame = originalFrame
}
Run Code Online (Sandbox Code Playgroud)

再次,这是非常hacky,但我还没有找到一个不同的方式来解决这个问题.

结果

UIRefreshControl继承了覆盖