虽然我还建议您按照 Artem 发布的内容进行操作,但它并没有直接为我消除差距。结果我遇到了与UIRefreshControl 相关的两个不同问题,并发现了一些“黑客”来解决它们。简单的解决方法是将 tableView 的背景颜色设置为与刷新控件相同的颜色,但这会产生在 table view 底部看到相同颜色的副作用。
我的设置是一个UINavigationController 托管一个UIViewController 与一个UITableView 子视图和一个UISearchBar 设置为tableView 的tableHeaderView。我的目标是匹配导航栏、刷新控件和搜索栏的颜色。
问题 1
我认为这与您看到的问题相同。似乎一旦您拖动以开始拉动刷新操作,手势的前几个点就会出现一个间隙。在某个阈值之后,刷新控件变为正确的颜色。然而,在返回到 table view 的静止滚动状态的路上,我们再次看到相同的间隙,就在它达到 0 的内容偏移量之前。看起来像这样:
解决方案 1
如果您将UIRefreshControl 子类化并覆盖frame 和isHidden 属性并在设置它们时打印出它们的值,您会注意到刷新控件实际上并没有隐藏,直到距离表格视图的顶部是 4pt。同样,当您向下滚动时,您还会看到它被设置为隐藏在同一位置附近,这是在您无法再看到刷新控件以及为什么我们看到 tableView 背景的间隙之前。
在我们的子类中,我们可以通过覆盖isHidden 的setter 和getter 以及frame 的didSet 来防止这种“早期”隐藏和“晚期”取消隐藏,仅在刷新控件的偏移量实际上为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
}
再说一遍,这很老套,但我也没有找到其他方法来解决这个问题。
结果