【发布时间】:2012-12-14 11:09:28
【问题描述】:
当我以编程方式更新表格时,如何显示 UIRefreshControl? 使用 [self.refreshControl beginRefreshing] 使微调器动画但不显示它。
【问题讨论】:
标签: ios6 uitableview uirefreshcontrol
当我以编程方式更新表格时,如何显示 UIRefreshControl? 使用 [self.refreshControl beginRefreshing] 使微调器动画但不显示它。
【问题讨论】:
标签: ios6 uitableview uirefreshcontrol
您必须自己手动更改contentOffset 的UITableView。请务必考虑contentInset.top。它应该很简单:
CGPoint newOffset = CGPointMake(0, -[myTableView contentInset].top);
[myTableView setContentOffset:newOffset animated:YES];
【讨论】:
endRefreshing:[myTableView setContentOffset:CGPointZero animated:YES]; 后不重置 contentOffset,这往往会导致单元格绘制问题
viewWillAppear: 方法调用 [self.refreshControl beginRefreshing],而不是从 viewDidLoad: 调用。
这样就可以了
- (void)beginRefreshingTableView {
[self.refreshControl beginRefreshing];
// check if contentOffset is zero
if (fabsf(self.tableView.contentOffset.y) < FLT_EPSILON) {
[UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^(void){
self.tableView.contentOffset = CGPointMake(0, -self.refreshControl.frame.size.height);
} completion:^(BOOL finished){
}];
}
}
【讨论】:
beginRefreshing,或者在动画调用之后,否则你设置的refreshControl的tintColor会被忽略。 stackoverflow.com/a/20383030/903544
对于 Swift 3,这是我根据 Peter Lapisu 的回答得出的结论:
override func viewDidLoad() {
super.viewDidLoad()
self.refreshControl?.addTarget(self, action: #selector(refresh), forControlEvents: UIControlEvents.ValueChanged)
// ...
}
func refresh(sender:AnyObject) {
self.refreshControl?.beginRefreshing()
if let yOffsetTable = self.tableView?.contentOffset.y {
if yOffsetTable < CGFloat(Float.ulpOfOne) {
UIView.animate(withDuration: 0.25, delay: 0, options: UIViewAnimationOptions.beginFromCurrentState, animations: {
if let refreshControlHeight = self.refreshControl?.frame.height {
self.tableView?.contentOffset = CGPoint(x: 0, y: -refreshControlHeight)
}
}, completion: nil)
}
}
}
【讨论】:
对于 Swift 5,这是我唯一可以使用的版本。
extension UIRefreshControl {
func beginRefreshingManually() {
if let scrollView = superview as? UIScrollView {
scrollView.setContentOffset(CGPoint(x: 0, y: scrollView.contentOffset.y - frame.height), animated: false)
}
beginRefreshing()
sendActions(for: .valueChanged)
}
}
【讨论】: