UIScrollView + изменить ориентацию = испортил подпредставления (iPad) - PullRequest
1 голос
/ 28 сентября 2011

Я хочу использовать UIScrollView в качестве основного контейнера в приложении, что позволяет мне перемещаться назад и вперед между подпредставлениями.Для этого я создал UIViewController подкласс с UIScrollView IBOutlet :

. В методе viewDidLoad я создаю подстраницы:

for (int i= 0; i< pageCount; i++)
{
   CGRect frame = self.scrollView.frame;
   frame.origin.x = frame.size.width * i;
   frame.origin.y = 0;

   UIWebView* aWebView= [[UIWebView alloc] initWithFrame:frame];

   [self.scrollView addSubview:aWebView];
}

При запуске приложения (портретный режим) все работает.То есть UIWebViews располагаются рядом с правильными размерами, и я могу перемещаться назад и вперед между ними.

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

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

Кто-нибудь знает, что делать?

[править] Попытка отрегулировать размеры в соответствии с предложением mahboudz:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
{
   self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width * pageCount, self.scrollView.frame.size.height);

   for (int i= 0; i< pageCount; i++)
   {
      CGRect frame = self.scrollView.frame;
      frame.origin.x = frame.size.width * i;
      frame.origin.y = 0;

      UIWebView* view= [[self.scrollView subviews] objectAtIndex:i];

      view.frame= frame;
   }
}

Этот вид делает то, что я хочу, но имеетследующие проблемы:

1) можно увидеть, что подпредставления увеличиваются до правильного размера экрана при изменении ориентации

2), когда текущая страница, например, страница 2 из 5 страниц, страницане полностью виден после изменения ориентации, но находится за пределами экрана примерно на 40 пикселей

3) Я получаю странные эффекты в зависимости от того, запущено ли приложение в портретном или ландшафтном режиме (симулятор), ilЯ пытаюсь объяснить:

Когда приложение запускается в портретном режиме:

  • Форма / граница подпредставлений выглядит испорченной / за кадром, см. скриншоты:

http://i53.tinypic.com/21jr76x.png

  • когда я поворачиваюсь в ландшафт, все выглядит хорошо, прокрутка работает превосходно.даже когда я поворачиваюсь назад к портрету, теперь все отлично:

http://i55.tinypic.com/if3iiw.png

Когда приложение запускается в ландшафтном режиме:

  • Я получаю такие же испорченные глюки вверх / вне экрана, что и в портретном режиме

  • Переключение назад и вперед между портретным и альбомным режимами исправляет это в ландшафтном режиме

  • НО: портретный режим будет иметь подпредставления с шириной ландшафтного режима, таким образом подпредставления слишком широки

Я пытался исправить 1), делая код выше в willRotateToInterfaceOrientation однакоон полностью испортил макет.

Я исправил 2), добавив следующий код в didRotateFromInterfaceOrientation:

// update the scroll view to the appropriate page

CGRect frame = self.scrollView.frame;
frame.origin.x = frame.size.width * self.currentPage;
frame.origin.y = 0;

[self.scrollView scrollRectToVisible:frame animated:NO];

Примечание: текущая страница определяется в scrollViewDidScroll

Понятия не имею, как починить 3)

Ответы [ 2 ]

3 голосов
/ 04 сентября 2012

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

CGFloat screenHeight =[UIScreen mainScreen].bounds.size.height;
CGFloat screenWidth =[UIScreen mainScreen].bounds.size.width;
self.scrollView.frame = CGRectMake(0, 0, screenWidth, screenHeight);
self.scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * numberOfPages, self.scrollView.frame.size.height);
self.scrollView.contentOffset = CGPointMake(visiblePageBeforeRotation * self.scrollView.bounds.size.width, 0);

Этот код должен быть размещен в методе

-(void)willRotateToInterfaceOrientation: (UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration

Проверьте также ответ на этот вопрос: Очистить переходы авторотации в подкачке UIScrollView У этого есть хороший пример под названием Rotolling для вращения UIScrollView с включенной подкачкой страниц.

Надеюсь, это поможет.

P.S .: Я столкнулся с проблемой при перемещении центра UIWebView на поворот.

0 голосов
/ 29 сентября 2011

Вам необходимо реализовать viewWillRotate/viewDidRotate и внести необходимые изменения в размер и ориентацию нашего контента.

...