UIRefreshControl перестает вращаться после того, как приложение неактивно
Я использую UIRefreshControl в UITableView:
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(refresh)
forControlEvents:UIControlEventValueChanged];
self.refreshControl = refreshControl;
С обработчиком refresh:
-(void)refresh {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// (...some long running operation...)
dispatch_async(dispatch_get_main_queue(), ^{
[self.refreshControl endRefreshing];
});
});
}
Во время продолжительной работы я делаю приложение неактивным нажатием кнопки "Домой". После этого я снова активирую приложение. Вращающийся элемент замерзает (перестает вращаться), и нет способа вернуть его в исходное состояние.
Как это исправить?
Ответы
Ответ 1
Я думаю, что это немного отложенный ответ, но сегодня я видел подобную проблему на ios 7, ios 6 продолжал вращаться,
здесь немного обходного пути для этого
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
if(self.refreshControl.isRefreshing) {
CGPoint offset = self.tableView.contentOffset;
[self.refreshControl endRefreshing];
[self.refreshControl beginRefreshing];
self.tableView.contentOffset = offset;
}
}
он остановится и начнет снова вращаться, но это произошло только на ios7 со мной, так что, возможно, вы должны проверить, не делать это на ios6
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
if(self.refreshControl.isRefreshing && [[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
CGPoint offset = self.tableView.contentOffset;
[self.refreshControl endRefreshing];
[self.refreshControl beginRefreshing];
self.tableView.contentOffset = offset;
}
}
Ответ 2
Это то, что сработало для меня
Swift 3 и Swift 4:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if self.refreshControl?.isRefreshing == true {
let offset = self.tableView.contentOffset
self.refreshControl?.endRefreshing()
self.refreshControl?.beginRefreshing()
self.tableView.contentOffset = offset
}
}
Swift 2.3:
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
if self.refreshControl?.refreshing == true {
let offset = self.tableView.contentOffset
self.refreshControl?.endRefreshing()
self.refreshControl?.beginRefreshing()
self.tableView.contentOffset = offset
}
}
Ответ 3
Это все еще проблема в iOS11. Решение нужно немного изменить, хотя в противном случае управление обновлением будет слишком быстрым.
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if(self.refreshControl.isRefreshing) {
CGPoint offset = self.tableView.contentOffset;
[self.refreshControl endRefreshing];
// Delay the restart
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.05 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self.refreshControl beginRefreshing];
self.tableView.contentOffset = offset;
});
}
}