iOS7 UIRfreshControl изменяет contentInset

У меня есть 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).

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


person Fogmeister    schedule 20.11.2013    source источник
comment
Удалил мой ответ, так как вы, очевидно, уже исключили его. Я полагаю, вы вызываете endRefreshing?   -  person jhilgert00    schedule 20.11.2013
comment
Не беспокойся. Да, когда я вызываю endRefreshing на элементе управления, он исчезает. Несколько раз это работает нормально, но затем происходит сбой, и изменения contentInset скрывают несколько верхних строк под панелью навигации.   -  person Fogmeister    schedule 20.11.2013
comment
Вероятно, вам может сойти с рук сброс вашего фрейма после обновления, но вам не нужно этого делать.   -  person jhilgert00    schedule 20.11.2013
comment
На данный момент я обошел это, вручную установив для contentInset значение 0 после завершения обновления. Но теперь это не анимирует исчезновение элемента управления обновлением. Просто прыгает обратно. Если я попытаюсь анимировать его, он вылетает. ржу не могу   -  person Fogmeister    schedule 20.11.2013
comment
Последнее, что вы можете попробовать, это добавить UIRefreshControl в IB. на раскадровке, если вы нажмете на UITableviewController и в инспекторе атрибутов установите для параметра «Обновление» значение «включено», он добавит для вас элемент управления UIRefresh. Затем вы можете связать с ним IBAction или добавить селектор в viewDidLoad. Может стоит попробовать.   -  person jhilgert00    schedule 20.11.2013
comment
Ах, похоже, вы могли бы быть на что-то с этим. К сожалению, я использую UIViewController с UITableView, а не с UITableViewController. Я обязательно попробую в следующий раз. Спасибо   -  person Fogmeister    schedule 20.11.2013


Ответы (4)


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

Элемент управления обновлением делает свое волшебство, возясь с вставками содержимого прокрутки, особенно когда он заканчивает обновление. К сожалению, контроллер представления также возится с вставками содержимого представления прокрутки, чтобы разместить его под полупрозрачными панелями навигации и состояния. Наступает веселье. Является ли это также проблемой для iOS 6 (или «старой доброй iOS6», как я назвал ее, когда имел дело с той же проблемой).

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

person jrturton    schedule 20.11.2013
comment
Кажется, я исправил это сейчас. Я понял, что completionBlock из NSOperation вызывается в том же потоке, что и операция. Сюда я звонил endRefreshing. Я отправил это в основной поток, и теперь он работает без изменения contentInset. У вас есть ссылка на что-нибудь о том, что UIRefreshControl только официально поддерживает UITVC? - person Fogmeister; 21.11.2013
comment
В документах говорится, что он предназначен для назначения UITVC. addSubview: вещь упоминается только в SO, а не в документах. - person jrturton; 21.11.2013
comment
См. комментарий Дэйва ДеЛонга к этому ответу: stackoverflow.com/a/12502450/852828 - person jrturton; 21.11.2013
comment
Вместо этого я заменил все это на uitvc, и теперь все работает нормально. Даже после перехода на основной поток у меня были проблемы с его странным поведением. - person Fogmeister; 23.11.2013
comment
У меня точно такая же проблема. Я использую UiRefreshControl с UICollectionView. Кажется, он изменил мой contentInset. После endRefresh я снова устанавливаю свой contentInset на правильное значение. Это нормально? Или мы должны воздерживаться от использования UIRfreshControl с CollectionView - person user1010819; 10.12.2013

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

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

person Bruno Philipe    schedule 05.06.2016
comment
Убедитесь, что вы поставили условие if(!refreshControl), иначе каждый раз, когда ваша страница появляется, она добавляет к ней контроль обновления. - person George; 31.08.2016

Сбросьте таблицу contentInset.

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

Вам нужно переопределить 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];
}
person Sergey Petruk    schedule 27.02.2015
comment
Упомянутый вами URL больше не существует - person Nagarjun; 23.11.2016