拉下UIRefreshControl下面的白线.. tableView

时间:2016-12-26 13:00:04

标签: ios uitableview swift3 uirefreshcontrol

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

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

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

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

http://gph.is/2ijyH26

3 个答案:

答案 0 :(得分:8)

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

我的设置是UINavigationController托管UIViewController,其中UITableView子视图和UISearchBar设置为tableView的tableHeaderView。我的目标是匹配导航栏,刷新控件和搜索栏的颜色。

问题1

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

UIRefreshControl flashing gap

解决方案1 ​​

如果您继承UIRefreshControl并覆盖frameisHidden属性,并在设置它们时打印出它们的值,您会注意到刷新控件没有&#39 ; t实际上是取消隐藏,直到距离表格顶部的距离是4pt。类似地,当你向下滚动时,你也会看到它被设置为隐藏在同一个地方周围,这是在你不能再看到刷新控制之前以及为什么我们看到间隙偷看到tableView背景

在我们的子类中,我们可以提前预防这个问题。隐藏和迟到'取消隐藏isHiddendidSet的{​​{1}}的setter和getter,仅在刷新控件的偏移量实际为0时隐藏。

frame

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

第2期

当在问题1中提示刷新超过差距阈值时,似乎UIRefreshControl的框架无法跟上搜索栏。这给了我们另一种跟随搜索栏的差距。这就是它的样子:

UIRefreshControl lagging gap

解决方案2

这个滞后的差距看起来像帧的更新速度不如我们的滚动甚至可能是动画的。事实证明,如果我们在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 } } } } 之类的地方设置框架,我们会得到以下行为:

layoutSubviews

同样,这非常hacky,但我还没有找到一种不同的方式来解决这个问题。

结果

UIRefreshControl subclassed with overrides

答案 1 :(得分:0)

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

refreshControl.addTarget(self, action: Selector(("refresh:")), for: UIControlEvents.valueChanged)
 if #available(iOS 10.0, *) {
     tableView.refreshControl = refreshControl
 }
 else {
     tableView.backgroundView = refreshControl
 }

答案 2 :(得分:-1)

将tableview的背景颜色更改为与UIRefreshControl相同的颜色。