UITableView使用UIRefreshControl闪烁

问题描述 投票:10回答:7

我在aUITableViewUIRefreshControl方法中定义了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刷新。表视图在主队列上重新加载。正在使用自动布局调整单元格的大小。


ios objective-c uitableview uiviewcontroller uirefreshcontrol
7个回答
1
投票

我想问题是使用estimatedHeight和UITableViewAutomaticDimension以及uitableview的reloadData。据报道here

延迟会起作用但它仍然不是实现它的正确方法,除非你想要一个hackish工作。


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()

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
投票

迅速

你可能想用

extendedLayoutIncludesOpaqueBars = true

在您的ViewController中,以便拥有正确的UIRefreshControl动画。


0
投票
-(void)refreshMessages{

self.messages = [NSMutableArray new];
[self loadData];

[self.tableView reloadData];
[self.refreshControl endRefreshing];
}

0
投票

可能是调用reloadDataendRefreshing可能导致闪烁发生,所以我所做的是稍微修改你的代码并删除了清除了电影的调度块

- (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];
//    });

}

0
投票

你有没有尝试过?

[self.messagesTableView beginUpdates];
[self.messagesTableView reloadSections:[NSIndexSet indexSetWithIndex:0/*target section*/]  withRowAnimation:UITableViewRowAnimationNone];
[self.messagesTableView endUpdates];

代替:

[self.messagesTableView reloadData];
© www.soinside.com 2019 - 2024. All rights reserved.