Сдвиг вида после отображения модального окна - возможно, связанный с AutoLayout

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

Кнопка представляет другой вид, который включает элемент навигации для закрытия.

Однако после увольнения содержимое исходного UIScrollView смещается. Как ни странно, величина смещения связана с положением прокрутки во время презентации.

Демонстрационный проект здесь является небольшим примером этой проблемы. Запустите его в симуляторе iPhone и прокрутите вниз, чтобы использовать «модальную» кнопку. После отклонения модальной попытки прокрутки вверх - проблема должна быть ясна.

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

ПЕРЕД ПРЕЗЕНТАЦИЕЙ

ДО ПРЕЗЕНТАЦИИ

ПОСЛЕ ПРЕЗЕНТАЦИИ

ПОСЛЕ ПРЕЗЕНТАЦИИ


person Ben Packard    schedule 04.08.2013    source источник
comment
Любопытное примечание: мой реальный проект сдвигает содержимое прокрутки в противоположном направлении (вниз), тогда как демонстрационный проект здесь сдвигает их вверх. Надеюсь, решения проблемы в демонстрационном проекте достаточно, чтобы я начал работать.   -  person Ben Packard    schedule 05.08.2013


Ответы (2)


Я не эксперт в AutoLayout, но я исправил это, добавив ограничения метки и кнопки к self.view вместо self.scrollView.

Например:

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[l1]"
                                                                  options:0
                                                                  metrics:nil
                                                                    views:@{@"l1":self.l1}]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[l1]"
                                                                  options:0
                                                                  metrics:nil
                                                                    views:@{@"l1":self.l1}]];

Почему это исправляет... понятия не имею :D

person Andrei Stanescu    schedule 05.08.2013
comment
Работал как шарм :) - person Craig Siemens; 11.10.2013

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

В viewDidDisappear: сохраните текущий вид прокрутки contentOffset в свойство и сбросьте его до нуля:

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

    self.previousContentOffset = self.scrollView.contentOffset;

    self.scrollView.contentOffset = CGPointZero;
}

Затем в viewWillAppear: верните смещение содержимого к тому, что было раньше. Мне пришлось отправить это в основную очередь, чтобы заставить его работать правильно:

- (void)viewWillAppear:(BOOL)animated 
{
    if (!CGPointEqualToPoint(self.previousContentOffset, CGPointZero))
    {
        dispatch_async(dispatch_get_main_queue(), ^{
            self.scrollView.contentOffset = self.previousContentOffset;
        });
    }
}
person James Frost    schedule 05.08.2013