Чистые переходы авторотации в подкачке UIScrollView - PullRequest
12 голосов
/ 24 июля 2010

У меня есть пейджинговый UIScrollView, в котором пользователь перелистывает изображения по горизонтали, как в Apple Photos.app.Это работает, но теперь я пытаюсь добавить поддержку поворота.

Я получил представление, вращающееся в порядке, и сумел правильно установить фреймы contentSize, bounds и subviews для адаптации к различным ориентациям.Так что до и после поворота все ок.

Однако сами переходы неудобны.Первое изображение вращается идеально, как если бы ось вращения находилась в мертвой точке изображения (рамка прокрутки).Второе изображение «качается», потому что ось вращения находится в том же месте: центр первого изображения.Чем дальше я получаю от первого изображения, тем быстрее «качается».

Возможно, я смогу замаскировать это, наложив непрозрачный UIView до поворота и скрыв его после.Но это взломать.Должен быть элегантный способ сделать это ...

Ответы [ 4 ]

40 голосов
/ 28 июля 2010

Честно говоря, я не знаю, что вы делаете, так как вы совсем нам не показали.

Но!

Я создал пример проекта с несколькими представлениями в виде прокрутки, и он отлично работает. Не стесняйтесь разбирать его по своему желанию. Это работает путем создания 5 представлений и добавления их в представление с прокруткой. Затем, после того как эти представления были настроены в первый раз, и каждый раз, когда приложение вращается, оно вызывает мой метод alignSubviews, чтобы расположить их в нужных местах на странице и сделать их такими же, как у вида прокрутки, при обновлении прокрутки просмотр contentSize. Перед выполнением поворота он отслеживает, на какой странице в данный момент находится представление прокрутки, а затем сбрасывает его на эту страницу во время поворота (поскольку размер страницы должен измениться).

Скачать "Rotolling"!

скриншот http://cl.ly/43de79be29c5a03a1775/content

7 голосов
/ 29 марта 2011

Я отмечаю эту дополнительную информацию для дальнейшего использования самостоятельно. Я решил это с идеей из решения @jtvandes. Однако в моем случае этого было достаточно с этими реализациями. Принудительный макет снова нарушил мой взгляд.

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{
    currentPageOffset = [hostingScrollView contentOffset].x / [hostingScrollView bounds].size.width;
}
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration 
{
    //  Layout changed instantly at this time.
    //  So we have to force to set offset instantly by setting animation to NO.
    [hostingScrollView setContentOffset:CGPointMake([hostingScrollView bounds].size.width * currentPageOffset, 0.0f) animated:NO];
}
1 голос
/ 01 июня 2013

Простое решение, которое хорошо работает, - это зарегистрироваться для уведомлений об изменении contentSize UIScrollView и затем обновить contentOffset в этот момент.

На ваш взгляд, загружая метод добавьте эту строку:

[self addObserver:theScrollView forKeyPath:@"contentSize" options:0 context:nil];

На ваш взгляд, метод выгрузки добавьте эту строку:

[self removeObserver:self forKeyPath:@"contentSize"];

Поймать уведомление:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    theScrollView.contentOffset = page * theScrollView.bounds.width;
}
1 голос
/ 28 июля 2010

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

Поскольку вы не делитесь ни одним кодом, следующее - просто догадки. Предположительно, вы применяете ротацию и перевод. Звучит , как будто вы вращаете содержимое UIScrollView. Получить это право будет сложно. Трудно сказать что-либо убедительное без кода, но если у вас есть только 1 ротация и 1 перевод, вы делаете это неправильно. Вам необходимо перевести текущий вид в опорную точку, повернуть и перевести обратно. В противном случае перевод будет частью вращения (отсюда и большое колебание).

Вам лучше повернуть UIScrollView сам. Он всегда будет находиться в определенном месте (а именно: на экране) с определенным центром. Содержимое будет вращаться вместе с ним.

...