总结并提供完整的解决方案。
问题:
如果 UIRefreshControl 在屏幕转换期间动画,它将保持可见但不会动画。视频https://vid.me/Bkb7
另外,如果拉动刷新动画开始但未完成,然后执行转换,UIRefreshControl 将被隐藏但卡住。视频https://vid.me/Bkb7
解决方案:
在 viewWillAppear 上启动 UIRefreshControl 动画并在 viewDidDisappear 上结束它。保存刷新过程的状态,以了解何时显示 UIRefreshControl。
Bellow 是一个完整的解决方案,它还可以处理正确的动画和简单的拉动刷新动画。
添加到 UITableView 或子类
初始化:
/// Refresh indicator
var refreshControl = UIRefreshControl()
/// Refresh state
var isRefreshing = false
/// Refresh controll update funcion. Set to enable pull to refresh
var refreshControllUpdateFunction: (() -> ())?
/// Prepeares UIRefreshControll. Call from init
func initRefreshControl(){
addSubview(refreshControl)
refreshControl.addTarget(self, action: "refreshControllTarget", forControlEvents: .ValueChanged)
refreshControl.beginRefreshing()
isRefreshing = true
}
Superview 事件处理程序:
/// Call on viewWillApper
func superviewWillApper(){
if isRefreshing && !refreshControl.refreshing{
startRefreshAnimation()
}
}
/// Call on viewDidDisapper
func superviewDidDisappear(){
endRefreshAnimation(false, dataFetched: !isRefreshing)
}
UIRefreshControl 动画处理程序:
/// Presents animating UIRefreshControll
func startRefreshAnimation(){
refreshControl.beginRefreshing()
contentOffset = CGPointMake(0, -refreshControl.bounds.size.height)
isRefreshing = true
}
/// Hides UIRefreshControll and saves state of refresh
func endRefreshAnimation(wasEmpty: Bool, dataFetched: Bool){
refreshControl.endRefreshing()
isRefreshing = !dataFetched
if !wasEmpty{
setContentOffset(CGPointZero, animated: true)
}else{
setContentOffset(CGPointZero, animated: false)
}
}
添加
table.isRefreshing = true
到刷新调用的开始。
结果视频https://vid.me/LyuI