UITableView使用UIRefreshControl闪烁

Sid*_*kan 10 objective-c uitableview uiviewcontroller ios uirefreshcontrol

我有一个UITableViewUIRefreshControl内侧限定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];
}
Run Code Online (Sandbox Code Playgroud)

我使用自定义单元格来更新单元格数据.在重新加载数据时UITableView闪烁.有办法避免这种情况吗?

编辑 我已将视频文件链接到示例演示.在UITableView重新加载数据,闪烁.我使用autolayout来更新动态单元格高度.

以下是可以重新创建此问题的示例代码.应该拉UITableView刷新.表视图在主队列上重新加载.正在使用自动布局调整单元格的大小.


小智 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()
Run Code Online (Sandbox Code Playgroud)


Dav*_*ton 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];
Run Code Online (Sandbox Code Playgroud)

使用第一个选项可能需要更少的延迟.甚至0.0秒似乎在你的示例代码中起作用.这足以在下一次屏幕刷新时获得-endRefreshing动画.


Des*_*ner 2

我猜问题是使用estimatedHeight & UITableViewAutomaticDimension 以及uitableview 的reloadData。这已被报道在这里

延迟是可行的,但它仍然不是实现它的正确方法,除非你想要一个黑客的解决方案。