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];
}