IOS7 UIRefreshControl изменяет содержимоеInset

У меня есть UINavigationController в моем приложении. Значение UINavigationBar установлено на непрозрачное, и все виды прокрутки не перекрываются под панелью.

В одном представлении у меня есть UITableView. Рамка UITableView составляет (0 0; 320 504) на моем iPhone 5. то есть высота 568 - 64 (высота панели навигации и строка состояния).

contentInset UITableView - (0, 0, 0, 0). Когда в первом представлении таблицы значение contentOffset равно (0, 0).

Это нормально. Работает блестяще.

Я добавил UIRefreshControl в представление таблицы. Это работает пару раз, но затем, после нескольких раз, когда вы делаете попытку, чтобы обновить, содержимое вверху "застряло" под навигационной панелью.

Когда это произойдет, я проверяю contentInset, и теперь он (-60, 0, 0, 0).

Есть ли способ остановить UIRefreshControl от изменения contentInset?

Ответ 1

Вероятно, это причина, по которой UIRefreshControl в настоящее время поддерживается только UITableViewController, а не добавлением какого-либо прокрутки (во многих случаях это может обойтись).

Управление обновлением делает свою магию, перерабатывая вставки содержимого прокрутки - особенно когда заканчивается обновление. К сожалению, контроллер просмотра также перерабатывает вставки содержимого прокрутки, чтобы соответствовать им в прозрачных навигационных и статусных барах. Забавно. Это также проблема на iOS 6 (или "старый добрый iOS6", как я ее называл, когда занимался той же проблемой).

Самое быстрое решение - это, вероятно, добавить представление таблицы в качестве дочернего UITableViewController вместо простого подзаголовка. Я думаю, что UITableViewController управляет вставками для вас в конце обновления. Если это не сработает, у меня есть обходные пути для этого, но мне придется подождать, пока я вернусь в офис.

Ответ 2

Я добавлю этот ответ здесь, если у кого-то есть проблемы с UIRefreshControl, изменив свойства управления (атрибут title, tint и т.д.):

Не связывайтесь с UIRefreshControl на -viewDidLoad:, используйте -viewDidAppear: вместо этого.

Ответ 3

Reset содержимое вашего представления в таблице.

-(void)pullToRefresh
{
    [self.tableView reloadData];
    [self.refreshControl endRefreshing];
    [self.tableView setContentInset:UIEdgeInsetsMake(0, 0, 0, 0)];
}

Ответ 4

Вам нужно переопределить setContentInset: в вашем UICollectionView

- (void)setContentInset:(UIEdgeInsets)contentInset {
  if (self.tracking) {
    CGFloat difference = contentInset.top - self.contentInset.top;
    CGPoint translation = [self.panGestureRecognizer translationInView:self];
    translation.y -= difference * 3.0 / 2.0;
    [self.panGestureRecognizer setTranslation:translation inView:self];
  }
  [super setContentInset:contentInset];
}