UITableView使用UIRefreshControl闪烁

时间:2015-05-19 02:27:22

标签: ios objective-c uitableview uiviewcontroller uirefreshcontrol

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

7 个答案:

答案 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)

可能正在调用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];
//    });

}

答案 6 :(得分:0)

你试过吗?

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

而不是:

[self.messagesTableView reloadData];