У меня довольно простая конфигурация:
A UIViewController
, с дочерним элементом UIScrollView
и a UIImageView
в этом UIScrollView
.
Я установил UIImageView
с высотой, достаточной для выхода из видимой области (т.е. Выше до 1024pt
), и установите ограничение Bottom space to superview
моего UIImageView
на фиксированное положительное значение (20
например).
Вся настройка работает так, как ожидалось, изображение хорошо прокручивается в своем родителе. За исключением случаев, когда просмотр прокручивается (эффект более заметен, если вы прокручиваетесь в нижней части представления), затем исчезают и снова появляются (вы переключились на другое представление и вернулись), значение прокрутки восстанавливается, но содержимое вид прокрутки перемещается во внешнюю верхнюю часть его родительского представления.
Это не просто объяснить, я попытаюсь это сделать:
Если вы хотите проверить/просмотреть источник (или раскадровку, я не редактировал ни одной строки кода). Я поместил небольшую демонстрацию в свой github: https://github.com/guillaume-algis/iOSAutoLayoutScrollView
Я прочитал iOS 6 changelog и объяснение по этой теме и думаю, что это правильная реализация второго варианта ( чистый автоматический макет), но в этом случае почему UIScrollView
ведет себя так неустойчиво? Я что-то упускаю?
EDIT. Это та же проблема, что и # 12580434 uiscrollview-autolayout-issue. Ответы - обходные пути, так как каждый нашел правильный способ исправить это или это ошибка iOS?
EDIT 2: я нашел другое обходное решение, которое сохраняет положение прокрутки в том же состоянии, в котором пользователь оставил его (это улучшение по сравнению с 12580434 принятый ответ):
@interface GAViewController ()
@property CGPoint tempContentOffset;
@end
@implementation GAViewController
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.tempContentOffset = self.mainScrollView.contentOffset;
self.scrollView.contentOffset = CGPointZero;
}
-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
self.scrollView.contentOffset = self.tempContentOffset;
}
В основном сохраняйте смещение в viewWillAppear
, reset до начала координат, а затем восстановите значение в viewDidAppear
. Кажется, что проблема возникает между этими двумя вызовами, но я не могу найти ее источник.