我在aUITableView
的UIRefreshControl
方法中定义了aviewDidLoad:
withUIViewController
,如下所示:
- (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];
}
我使用自定义单元格来更新单元格数据。在重新加载数据时,theUITableView
闪烁。有办法避免这种情况吗?
编辑我已将video文件链接到示例演示。关于重装数据的UITableView
,闪烁。我使用autolayout来更新动态单元格高度。
这是一个sample代码,可以重现这个问题。应该拉UITableView刷新。表视图在主队列上重新加载。正在使用自动布局调整单元格的大小。
我想问题是使用estimatedHeight和UITableViewAutomaticDimension以及uitableview的reloadData。据报道here
延迟会起作用但它仍然不是实现它的正确方法,除非你想要一个hackish工作。
我今天遇到了同样的问题,我设法使用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()
问题是你一起调用-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动画。
迅速
你可能想用
extendedLayoutIncludesOpaqueBars = true
在您的ViewController中,以便拥有正确的UIRefreshControl动画。
-(void)refreshMessages{
self.messages = [NSMutableArray new];
[self loadData];
[self.tableView reloadData];
[self.refreshControl endRefreshing];
}
可能是调用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];
// });
}
你有没有尝试过?
[self.messagesTableView beginUpdates];
[self.messagesTableView reloadSections:[NSIndexSet indexSetWithIndex:0/*target section*/] withRowAnimation:UITableViewRowAnimationNone];
[self.messagesTableView endUpdates];
代替:
[self.messagesTableView reloadData];