Вызов прокрутки 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);