Исход UIScrollView изменяется после возврата обратно в UIViewController
У меня есть подкласс UIViewController
как сцена в раскадровке, содержащая UIScrollView
, содержащую различные подсмотры. Одним из подзонов является UIButton
, который переходит в другой подкласс UIViewController
. Когда я вернусь из представления (вытащите UIViewController
из стека контроллера навигации), я обнаружил, что начало представления прокрутки каким-то образом изменилось, хотя значения contentsize
и contentoffset
кажутся правильными.
Интересно также, что приложение имеет панель вкладок, и когда я убираю и возвращаюсь к этому представлению, представление прокрутки вернется правильно со смещением в (0, 0).
В этом процессе практически нет кода, так как он почти все в раскадровке. Поскольку я довольно новичок в использовании раскадровки, я полагаю, что я делаю что-то неправильно, хотя я не знаю, что. Любые идеи относительно того, что это может быть? Возможно, проблемы с размерами или ограничения?
Ответы
Ответ 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 иначе