我在UITableView
的{{1}}方法中定义了UIRefreshControl
viewDidLoad:
,如下所示:
UIViewController
我使用自我调整大小来更新单元格数据。在重新加载数据时- (void)viewDidLoad {
[super viewDidLoad];
self.refreshControl = [[UIRefreshControl alloc] init];
[self.refreshControl addTarget:self action:@selector(refreshMessages) forControlEvents:UIControlEventValueChanged];
UITableViewController *tableViewController = [[UITableViewController alloc] init];
tableViewController.tableView = self.messagesTableView;
tableViewController.refreshControl = self.refreshControl;
}
- (void)refreshMessages {
//load data items
if ([self.refreshControl isRefreshing]) {
[self.refreshControl endRefreshing];
}
[self.messagesTableView reloadData];
}
闪烁。有没有办法避免这种情况?
修改
我已将video文件链接到示例演示。重载数据UITableView
闪烁。我使用autolayout来更新动态单元格高度。
以下是可以重新创建此问题的sample代码。应该拉UITableView刷新。表视图在主队列上重新加载。正在使用自动布局调整单元格的大小。
答案 0 :(得分:12)
我今天遇到了同样的问题,我设法使用CATransaction来解决问题,这里是Swift中的代码片段,在UITableViewController中执行:
CATransaction.begin()
CATransaction.setCompletionBlock { () -> Void in
/*wait for endRefreshing animation to complete
before reloadData so table view does not flicker to top
then continue endRefreshing animation */
self.tableView.reloadData()
}
self.refreshControl!.endRefreshing()
CATransaction.commit()
答案 1 :(得分:6)
问题是你一起调用-reloadData和-endRefreshing。两者都想更新视图。你需要将它们分开一点。
其中一个选项可以使用,具体取决于您希望看到单元格更新的位置:
[self.tableView reloadData];
[self.refreshControl performSelector:@selector(endRefreshing) withObject:nil afterDelay:0.5];
[self.refreshControl endRefreshing];
[self.tableView performSelector:@selector(reloadData) withObject:nil afterDelay:0.5];
第一个选项可能需要更少的延迟。甚至0.0秒似乎在你的示例代码中起作用。这足以在下一个屏幕刷新时获得-endRefreshing动画。
答案 2 :(得分:1)
我猜这个问题是使用的估计高度& UITableViewAutomaticDimension和uitableview的reloadData。据报道here
延迟会起作用,但它仍然不是实现它的正确方法,除非你想要一个hackish工作。
答案 3 :(得分:1)
快速
您可能想使用
extendedLayoutIncludesOpaqueBars = true
在ViewController中,以获取正确的UIRefreshControl动画。
答案 4 :(得分:0)
-(void)refreshMessages{
self.messages = [NSMutableArray new];
[self loadData];
[self.tableView reloadData];
[self.refreshControl endRefreshing];
}
答案 5 :(得分:0)
可能正在调用reloadData
而endRefreshing
可能导致闪烁发生,所以我所做的是稍微修改了你的代码并删除了清除了电影的调度块
- (void)refreshMessages{
self.messages = [NSMutableArray new];
[self loadData];
[self.tableView reloadData];
[self.refreshControl performSelector:@selector(endRefreshing) withObject:nil afterDelay:0.5];
// double delayInSeconds = 0.5;
// dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t) (delayInSeconds * NSEC_PER_SEC));
// dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
// [self.refreshControl endRefreshing];
// });
}
答案 6 :(得分:0)
你试过吗?
[self.messagesTableView beginUpdates];
[self.messagesTableView reloadSections:[NSIndexSet indexSetWithIndex:0/*target section*/] withRowAnimation:UITableViewRowAnimationNone];
[self.messagesTableView endUpdates];
而不是:
[self.messagesTableView reloadData];