SetContentOffset UIScrollView вызывается перед загрузкой нового подпредставления - PullRequest
3 голосов
/ 27 июля 2011

У меня есть UIView, в который я перемещаюсь, используя UIScrollView. Код выглядит так:

[view setObject:object]; // updates a bunch of labels, images, etc
[scrollView addSubview:view];
[scrollView setContentOffset:CGPointMake(320,0) animated:YES];

Проблема в том, что scrollView, по-видимому, не ожидает полной загрузки представления, прежде чем анимировать его contentOffset, и поэтому анимация довольно резкая (почти отсутствует на первом слайде и на старых устройствах). Как ни странно, переключение 3-й строки на это исправляет это:

[UIView animateWithDuration:0.3 animations:^{
    [scrollView setContentOffset:CGPointMake(320,0) animated:NO];
}];

Никаких задержек, идеально плавное скольжение. Однако это не вызывает никаких вызовов UIScrollViewDelegate, от которых я также зависел (но которые не отвечают за задержку).

Любая идея о том, как я мог сказать UIScrollView ждать полной загрузки представления, прежде чем анимировать его contentOffset? Или, может быть, мне чего-то не хватает?

РЕДАКТИРОВАТЬ : прежде чем кто-либо еще предложит это: да, я попробовал:

[self performSelector:@selector(slideIn) withObject:nil afterDelay:1];

просто чтобы посмотреть, исправит ли это. И да, это исправляет отставание, но это не фактическое решение. performSelector:afterDelay: никогда не является решением, это только поверхностное исправление. Кроме того, вы заставляете пользователя каждый раз ждать дополнительные секунды (поскольку фактическая задержка может быть намного меньше, чем 1 секунда, в зависимости от модели устройства).

Ответы [ 3 ]

1 голос
/ 27 июля 2011

вы пытались запустить прокрутку в функции viewDidAppear viewcontroller ... возможно, это вызывается после завершения загрузки.

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

1 голос
/ 15 сентября 2011

Выполнение селектора после задержки 0,01 работает, потому что вызов запланирован в цикле выполнения вместо немедленного вызова метода. В этом отношении afterDelay: 0.0 также может работать. Не пытался в этом конкретном случае, но работает в подобных ситуациях.

0 голосов
/ 27 июля 2011

Попробуйте, установите contentSize после некоторой задержки (здесь задержка составляет 2 секунды).

[view setObject:object];
[scrollView addSubview:view];
[self performSelector:@selector(contentSize) withObject:nil afterDelay:2];
}
-(void) contentSize {
[scrollView setContentOffset:CGPointMake(320,0) animated:YES];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...