Подтвердить что ты не робот

Исход UIScrollView изменяется после возврата обратно в UIViewController

У меня есть подкласс UIViewController как сцена в раскадровке, содержащая UIScrollView, содержащую различные подсмотры. Одним из подзонов является UIButton, который переходит в другой подкласс UIViewController. Когда я вернусь из представления (вытащите UIViewController из стека контроллера навигации), я обнаружил, что начало представления прокрутки каким-то образом изменилось, хотя значения contentsize и contentoffset кажутся правильными.

Интересно также, что приложение имеет панель вкладок, и когда я убираю и возвращаюсь к этому представлению, представление прокрутки вернется правильно со смещением в (0, 0).

В этом процессе практически нет кода, так как он почти все в раскадровке. Поскольку я довольно новичок в использовании раскадровки, я полагаю, что я делаю что-то неправильно, хотя я не знаю, что. Любые идеи относительно того, что это может быть? Возможно, проблемы с размерами или ограничения?

4b9b3361

Ответ 1

На самом деле, я поместил эту строку кода в viewDidDisappear и так, чтобы она запоминала смещение при повторном представлении, я добавил эту строку перед ней

 self.contentOffset = self.scrollView.contentOffset;

а также

 - (void)viewDidLayoutSubviews { 
       self.scrollView.contentOffset = self.contentOffset; 
 }

Ответ 2

В iOS 7/8/9 простой self.automaticallyAdjustsScrollViewInsets = NO; решил проблему в моем случае.

Ответ 3

Попробуйте это в viewWillAppear контроллера вида, к которому вы возвращаетесь:

 self.scrollView.contentOffset = CGPointMake(0, 0);

Изменить: при добавлении кода Peter вы получите лучшие результаты с помощью:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:YES];
    self.scrollView.contentOffset = CGPointMake(0, 0);
}

плюс

- (void)viewWillDisappear:(BOOL)animated {  
    self.recentContentOffset = self.scrollView.contentOffset;
    [super viewWillDisappear:animated];
}

и

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    self.scrollView.contentOffset = CGPointMake(0, self.recentContentOffset.y);
}

Вы возвращаетесь в исходную позицию прокрутки, не имеете визуального побочного эффекта, а сам вид прокрутки правильно позиционируется в своем супервизии (что было проблемой) после возвращения.

Ответ 4

У меня была аналогичная проблема, после отклонения viewController, contentOffset из моего tableView был изменен на (0, -64).

мое решение было немного странным, я пробовал все остальные ответы, но не имел успеха, единственное, что исправляло мою проблему, заключалось в том, чтобы переключить позицию tableView в дереве элементов управления .xib

это был первый элемент управления в родительском представлении:

before

Я переместил tableView сразу после ImageView и работал:

after

кажется, что помещать представление таблицы в первую позицию вызывало проблемы, и перемещение представления таблицы в другую позицию устраняло проблему.

P.D. Я не использую autoLayout ни раскадровки

надеюсь, что это может помочь кому-то!

Ответ 5

Я использую collectionView, и у меня была аналогичная проблема. Для iOS 11: в инспекторе размеров есть "вставка содержимого". Установите значение "Никогда". Это решило проблему для меня. Я надеюсь, что это помогает кому-то.

Цель C:

if (@available(iOS 11, *)) {
   [UIScrollView appearance].contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}

Swift:

if #available(iOS 11, *) {
UIScrollView.appearance().contentInsetAdjustmentBehavior = .never
}

Ответ 6

К сожалению, предложения Peter и MacMark не работали для меня (Xcode 5 w/auto-layout). Решение состояло в том, чтобы перейти к раскадровке, выбрать контроллер вида и Reset to Suggested Constraints in View Controller.

enter image description here

Ответ 7

Недавно я задал вопрос о подобной проблеме, но в другом контексте: Кадр не отражает ограничения автоматической компоновки после отклонения модального контроллера просмотров

В моем случае начало пользовательского представления контейнера внутри представления прокрутки смещается, а не начало самого представления прокрутки. Что касается автоматической компоновки, пользовательский контейнерный вид прикрепляется к четырем сторонам прокрутки.

Вид контейнера создается и конфигурируется программно, а не в IB. Хотя ограничения вида контейнера не изменяются, начало представления контейнера смещается после отклонения контроллера модального представления. Это отключение между ограничениями и кадрами необъяснимо.

Что еще более примечательно, так это то, что проблема смещения происхождения осталась после удаления и повторного добавления всех связанных ограничений.

Я придумал аналогичное решение: сохраните значение для текущего смещения содержимого, установите смещение содержимого на "ноль", дайте системе поменять ваши взгляды, а затем восстановите смещение содержимого (т.е. танец с компенсацией контента).

В моем случае, однако, я должен был предпринять дополнительные шаги для решения проблемы. Мое представление прокрутки представляет собой просмотр прокрутки поискового вызова, который получает свои подзаголовки из метода tilePages (демонстрацией в старом видео WWDC). Изменение смещения содержимого прокрутки запускает метод tilePages с помощью метода scrollViewDidScroll: UIScrollViewDelegate. Я должен был установить флаг, чтобы отключить tilePages, пока я танцевал контент-офсет, иначе приложение потерпит крах.

Надеюсь, я смогу удалить код для танца со смещением контента при обновлении до iOS 7.

Ответ 8

Продолжение Проблема при выполнении следующих ответов:

Вторая попытка открыть представленный контроллер представления, не оставив контроллер представления, проблема осталась. Вот почему я публикую точные шаги, которые привели к моему решению.

  • Итак, я reset ограничения коллекцииView в раскадровке, убедившись, что они были привязаны к представлению основного представления PresentationController.

  • Добавлен: self.view.translatesAutoresizingMaskIntoConstraints = YES; внутри viewDidLoad контроллера представления представления.

  • И сохраненный, конфиденциально, contentOffset представления коллекции до появления модально представленного вида контроллера:

    (void)viewWillDisappear:(BOOL)animated
    {
        [super viewWillDisappear:animated];
    
        self.contentOffset = self.collectionView.contentOffset;
        self.collectionView.contentOffset = CGPointZero;
    }
    
    - (void)viewDidLayoutSubviews {
         [super viewDidLayoutSubviews];
         self.collectionView.contentOffset = self.contentOffset;
    }
    

Ответ 9

в последнее время я столкнулся с этой ошибкой, можно решить с помощью этих кодов:

// fix ios 6 bug begin
- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];

    if ([[[UIDevice currentDevice] systemVersion] floatValue] < 7) {
        isRecoredforios6 = YES;
        recordedOffsetforios6 = self.tableView.contentOffset;
        recordedSizeforios6 = self.tableView.contentSize;
    }
}

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    if (isRecoredforios6) {
        isRecoredforios6 = NO;
        self.tableView.contentSize = recordedSizeforios6;
        self.tableView.contentOffset = recordedOffsetforios6;
    }
}
// fix ios 6 bug end

спасибо Петру Якобу!

Ответ 10

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];

    if ([[[UIDevice currentDevice] systemVersion] floatValue] < 7) {
        _isRecoredforios6 = YES;
        _recordedOffsetforios6 = _scrollView.contentOffset;
        _recordedSizeforios6 = _scrollView.contentSize;
        _scrollView.contentOffset = CGPointZero;
    }

}

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];

    if (_isRecoredforios6) {
        _isRecoredforios6 = NO;
        _scrollView.contentSize = _recordedSizeforios6;
        _scrollView.contentOffset = _recordedOffsetforios6;
    }
}

Я исправил эту ошибку ios6, ее можно решить с помощью этих кодов. Я решил, что ошибка произошла в Scrollview. Спасибо всем моим друзьям!

Ответ 11

После нескольких попыток:

  • Установите autoAdjustsScrollViewInsets на false, чтобы узнать, была ли проблема с навигационной панелью.
  • Игра с фиксированными высотами ячеек...
  • Кэширование высот ячейки...
  • Сохранение свойства со смещением таблицы, его кеширование и установка его на viewWillAppear...
  • и др.

Я понял, что проблема связана с значением estimatedRowHeight, которое было установлено на 50 пикселей, когда оно должно быть ~ 150 пикселей. Обновление значения исправило проблему, и теперь представление таблицы сохраняет одинаковое смещение.

Ответ 12

Пробовали ли вы проверять параметр "Расширить края под непрозрачным баром"? Его можно найти в инспекторе атрибутов контроллера внутри раскадровки.

Он помогло, используя XCode 9 iOS 11.

введите описание изображения здесь

Ответ 13

Отключить опцию AutoLayout для этого xib иначе