Изменение UIScrollView contentOffset после другого представления

у меня есть UIViewController в Interface Builder, и я добавляю UIScrollView до UIView. У него есть contentOffset свойство равно 0.0, но когда я прокручиваю UIScrollView на самое дно и нажмите другой вид contentOffset изменения.

NSLog дает мне следующие значения:

//View just loaded
2013-09-09 16:19:27.455 my_app[24588:907] Scroll View content offset is 0.000000

//We came back from another view
2013-09-09 16:19:30.957 my_app[24588:907] Scroll View content offset is 108.000000

в чем причина такого поведения? Я только что добавил UIScrollView В IB и вообще ничего не делал в коде.

на contentHeight scrollView больше, чем self.view.height. Этот frame scrollView остается прежним.

6 ответов


посмотреть мой ответ: на подобный вопрос.

вам нужно установить scrollview в contentOffset соответственно в viewWillAppear: и viewWillDisappear:.

кроме того, см. Это:


для iOS 7/8 self.automaticallyAdjustsScrollViewInsets = NO; решена проблема.


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

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

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

before

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

after

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

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

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


когда вы покинете экран, на котором присутствует scrollview, и вернетесь, он добавит половину размера экрана сверху или слева или оба. Пустое место, чего ты не хочешь. И в моем случае подкачка становится беспорядочной и не работает должным образом, пока я не помещу свиток в CGPointZero программно или на ощупь, как пользователь. Если вы позвоните NSLog( @"%f", scrollview.contentSize.height ); on viewDidLayoutSubviews вы увидите, что размер изменился.

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

на @Steph Sharp ответ решите мою проблему, за исключением случаев, когда я открываю viewcontroller как всплывающее окно (presentViewController). Я попытался компенсировать значение, добавив сумму ошибки на viewDidLayoutSubviews но это ошибки подкачки.

короткий ответ, я в конечном итоге с:

- (void) viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    scrollView.contentOffset = previousPoint;
}

- (void) viewWillAppear:(BOOL)animated
{
    scrollView.contentOffset = CGPointZero;
}

- (void) viewWillDisappear:(BOOL)animated
{
    previousPoint = scrollView.contentOffset;
    scrollView.contentOffset = CGPointZero;
}

теперь он работает, когда я покидаю раздел или открываю всплывающее окно выше.


Я использовал https://github.com/michaeltyson/TPKeyboardAvoiding на UITableView.

моим решением было удалить class TPKeyboardAvoidingTableView из UITableView. Это вызывало проблему прокрутки на TableViewController со статическими и динамическими ячейками.


проверить, если contentSize свойство вашего scrollview является CGSizeZero. У меня была аналогичная проблема, потому что contentSize не было установлено.