UIScrollView, пейджинг и вращение: второе представление не выровнено должным образом после вращения - PullRequest
1 голос
/ 08 марта 2012

Я использую UIScrollView с включенной подкачкой и следующий код для добавления к нему подпредставлений (диаграмм основного графика).

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

Не могли бы вы помочь мне с этим вопросом пожалуйста ?Я пробовал много альтернатив, но не могу найти свою ошибку.Большое спасибо!

Вот так выглядит мой экран iPad после поворота в портретный режим со вторым видом:

Parts of first screen (large bars) shown on the left side of the second screen

:

Это мой метод viewDidLoad:

- (void)viewDidLoad {

self.scrollView.contentSize = CGSizeMake(768 * 2, 400);
chart1 = [[CPTGraphHostingView alloc]initWithFrame:CGRectMake(0, 0, 768, 400)];
chart2 = [[CPTGraphHostingView alloc]initWithFrame:CGRectMake(768, 0, 768, 400)];

self.scrollView.autoresizesSubviews = NO;
chart1.autoresizesSubviews = YES;
chart2.autoresizesSubviews = YES;
self.scrollView.contentOffset = CGPointZero;
self.scrollView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleWidth ;

chart1.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleWidth ;
chart2.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleWidth ;
[self.scrollView addSubview:chart1];
[self.scrollView addSubview:chart2];

}

Вот как я реализовал ротацию:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation

 {
    if  (UIDeviceOrientationIsPortrait(fromInterfaceOrientation)) {
        self.scrollView.contentSize = CGSizeMake(704 * 2, 400);
        chart1.frame = CGRectMake(0, 0, 704, 400);
        chart2.frame = CGRectMake(704, 0, 704, 400);
        }
    else {
        self.scrollView.contentSize = CGSizeMake(768 * 2, 400);
        chart1.frame = CGRectMake(0, 0, 768, 400);
        chart2.frame = CGRectMake(768, 0, 768, 400);
        } 
    }

Ответы [ 2 ]

3 голосов
/ 08 марта 2012

Я думаю, что вы должны изменить contentOffset прокрутки, когда происходит вращение. У вас должен быть способ узнать, какая страница отображается в данный момент перед поворотом (возможно, поместите эту информацию в переменную). Затем в вашем методе didRotate .. установите contentOffset прокрутки после изменения его размера, например так:

CGFloat offset = self.scrollView.frame.size.width * currentPageIndex;
[self.scrollView setContentOffset: offset];
1 голос
/ 08 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...