У меня довольно простая конфигурация:
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. Кажется, что проблема возникает между этими двумя вызовами, но я не могу найти ее источник.