Есть ли способ на самом деле * визуально проектировать * двойные виды (ландшафт + портрет) в Интерфейсном Разработчике? - PullRequest
5 голосов
/ 03 марта 2011

Мой текущий дизайн требует некоторой классной анимации между портретным и альбомным видами данных. Представление данных довольно сложное, поэтому между графическим элементом и элементами данных на экране, вероятно, одновременно находится около 30 кнопок и меток. Я создал очень тщательно разработанный интерфейс ... теперь я выкладываю элементы для ландшафта. До сих пор я нашел единственный способ сделать это - на самом деле выложить ландшафт в виде кода, например:

-(void) positionViews {
    UIInterfaceOrientation destOrientation = self.interfaceOrientation;
    if (destOrientation == UIInterfaceOrientationPortrait || destOrientation == UIInterfaceOrientationPortraitUpsideDown) {
        //---if rotating into PORTRAIT mode
        timeBGbox.frame = CGRectMake(14, 88, 134, 14);
        targetTime.frame = CGRectMake(0, 99, 150, 29);
        energyBGbox.frame = CGRectMake(156, 88, 68, 14);
        targetEnergy.frame = CGRectMake(154, 99, 70, 29);
        speedBGbox.frame = CGRectMake(234, 88, 68, 14);
        targetSpeed.frame = CGRectMake(226, 99, 48, 29);
        speedLabel.frame = CGRectMake(264, 99, 40, 36);
    } else {
        //---if rotating to LANDSCAPE mode
        timeBGbox.frame = CGRectMake(156, 12, 152, 14);
        targetTime.frame = CGRectMake(160, 23, 150, 29);
        energyBGbox.frame = CGRectMake(156, 50, 68, 14);
        targetEnergy.frame = CGRectMake(154, 61, 70, 29);
        speedBGbox.frame = CGRectMake(234, 50, 74, 14);
        targetSpeed.frame = CGRectMake(228, 61, 48, 29);
        speedLabel.frame = CGRectMake(269, 61, 40, 36);
    }
}

Это кропотливый процесс, требующий многих испытаний для достижения того, что я мог бы сделать визуально за считанные секунды в IB. В настоящее время, когда я переключаюсь между представлениями в IB и вручную перемещаю элементы в альбомном режиме, после переключения в портретный режим они оказываются не в том месте. Я использовал «пружины и распорки» настолько творчески, насколько это возможно, но большинство моих элементов нуждаются в точном ручном размещении за пределами AutoSizing.

Мой вопрос: Есть ли в IB режим переключения, позволяющий разрабатывать две графические компоновки вида с использованием инструментов визуальной компоновки, или это единственный способ использовать числовой код?

Ответы [ 4 ]

3 голосов
/ 03 марта 2011

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

@property (nonatomic, retain) IBOutlet UIView *portraitView;
@property (nonatomic, retain) IBOutlet UIView *landscapeView;

выложите поля в IB как хотите. Хитрость в том, что вам нужно удвоить количество розеток в заголовочном файле:

@property (nonatomic, retain) IBOutlet UIView *myLabel_portrait;
@property (nonatomic, retain) IBOutlet UIView *myLabel_landscape;

и в вашем коде вы должны поддерживать обе версии в актуальном состоянии. Лучше всего просто обновить их оба при обновлении одного из них.

Тогда код для автоматического поворота очень прост, просто:

if ( switchingToPortrait)
    self.view = self.portraitView;
else
    self.view = self.landscapeView;
1 голос
/ 03 марта 2011

Лучшее, что я могу придумать, - это иметь два вида и переключать их в didRotateFromInterfaceOrientation:.

0 голосов
/ 26 мая 2013

Создание ландшафтного и портретного вида в конструкторе интерфейсов.Для каждой ориентации расположите элементы так, как вы хотите.Когда вы довольны внешним видом, скопируйте координаты в ваш метод positionViews.

0 голосов
/ 03 марта 2011

AFAIK, нет способа сделать это в Интерфейсном Разработчике. Поскольку представления создаются из файла nib, в любом случае вы получите два экземпляра.

Как указано в документации для разработчиков, вы можете использовать layoutSubviews или просто использовать собственный метод в вашем контроллере представления, как здесь.

...