Вызов прокрутки topLayoutGuide вообще прокручивается?
У меня возникают странные проблемы с методом topLayoutGuide
, который я должен использовать в ситуации, когда setAutomaticallyAdjustsScrollViewInsets:
не работает. Чтобы сузить причину проблемы, я создал следующий минимальный пример, который просто устанавливает базовый вид таблицы для тестирования:
- Настройте новое приложение iOS Single View в Xcode.
-
Вставьте следующий код в реализацию ViewController.m:
@implementation ViewController
- (void)loadView
{
[self setTableView:[[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain]];
}
- (void)viewDidLoad
{
[super viewDidLoad];
[self setAutomaticallyAdjustsScrollViewInsets:NO]; // [*]
}
- (void)viewDidLayoutSubviews
{
UITableView *tableView = [self tableView];
UIEdgeInsets insets = [tableView contentInset];
// insets.top = [[self topLayoutGuide] length]; // [1]
// insets.top = 100; // [2]
[tableView setContentInset:insets];
[tableView setScrollIndicatorInsets:insets];
}
#pragma mark - Table view data source
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 100;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
[[cell textLabel] setText:[NSString stringWithFormat:@"%d", [indexPath row]]];
return cell;
}
@end
Я имею следующие проблемы:
-
Если я раскомментирую строку, помеченную [1]
, применяется правильная вставка, но прокрутка представления таблицы больше не работает. Когда я пытаюсь прокручивать, таблица просто возвращается к исходной позиции прокрутки после того, как я отпустил палец. Это поведение также вызвано простым вызовом [self topLayoutGuide]
, не присваивая результат чему-либо.
-
Если я раскомментирую строку [2]
вместо [1]
, прокрутка работает. Также применяется вставка 100 pt. Но теперь начальная позиция прокрутки автоматически настраивается так, чтобы содержимое перекрывало строку состояния.
([*]
: Это действительно похоже на что-то в сочетании с содержащим навигационный контроллер. В этом примере я, похоже, не делаю никакого различия, но я хочу отключить любое автоматическое поведение, чтобы быть уверенным.)
Есть ли что-то очевидное, что я делаю неправильно? Я действительно в растерянности.
Ответы
Ответ 1
Это определенно ошибка в iOS 7 (как представляется, не исправлена в 7.1), но, похоже, влияет только на UITableViewControllers
. Я переключился на использование UIViewController
со встроенным UITableView
, поскольку я не использую статические ячейки и не нуждаюсь в какой-либо "магии", которую дает UITableViewController
.
Как только я подключил UITableViewDataSource
и UITableViewDelegate
вручную, я смог начать использовать self.topLayoutGuide
, не испорчив tableView contentSize.
Это было приемлемым решением для меня, пока Apple не исправила ошибку.
Ответ 2
То же самое для меня, вместо получения topLayoutGuide, попробуйте следующее:
CGFloat topOffset = CGRectGetMaxY(self.refController.navigationController.navigationBar.frame);