Ориентация IOS с FlipViewController и основным представлением

Я использую два ViewController'а. MainView и FlipViewController. MainView содержит набор кнопок и элементов управления, а также графический дисплей, а FlipView содержит настройки.

MainView загружает другой XIB в зависимости от ориентации, чтобы облегчить разнообразие кнопок, которые я поддерживаю, и графический экран. Это дает большую гибкость в размещении вещей по-разному. Первоначально проект был создан до того, как в Xcode были добавлены функции StoryBoarding.

Обычный вариант использования: я начинаю в портретном режиме на MainView, а затем нажимаю кнопку, которая поворачивает FlipView в поле зрения. Я делаю что-то в FlipView (настраиваю аспекты программы), а затем фиксирую изменения, которые возвращают меня обратно в MainView. Пока все хорошо.

Проблема возникает, когда я вхожу в FlipView, а затем поворачиваю устройство, чтобы FlipView принял другую ориентацию. Допустим, я поворачиваю Портрет на Ландшафт. Затем вернитесь из FlipView в MainView. На данный момент MainView не знает о вращении, которое выполнил FlipView. Таким образом, он по-прежнему показывает MainView в портретном режиме с портретным XIB.

WillRotateToInterfaceOrientation MainView никогда не вызывается после возврата из FlipViewController. Таким образом, он никогда не узнает об изменении ориентации и, следовательно, сохраняет неправильный XIB для этой ориентации. Вот пример обработчика ориентации в willRotateToInterfaceOrientation...

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration    {

// if portrait, load the portrait XIB for Pad or Phone

if (UIInterfaceOrientationIsPortrait(toInterfaceOrientation)) {

    if( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {

        [[NSBundle mainBundle] loadNibNamed:@"MainViewiPad" owner:self options:nil];

    }else{

        [[NSBundle mainBundle] loadNibNamed:@"MainView" owner:self options:nil];

    }

    [self viewDidLoad];

    intorient = 1;
 else.... handle Landscape...

Поэтому я экспериментировал с подпрограммой viewWillAppear, пытаясь найти способы заставить MainView узнать о вращении и выполнить его системным образом. Но пока я не знаю, как заставить систему работать таким образом. Я подозреваю, что мне придется генерировать код, который вызывает перезагрузку правильной ориентации при вызове viewWillAppear. Но это работает неправильно, потому что мне никогда не удается вовремя загрузить изменение, и мне кажется неправильным пытаться перезагрузить новый XIB из сообщения viewWillAppear.

Любая помощь в понимании этого поведения очень ценится.


person Paul3333    schedule 23.01.2013    source источник


Ответы (1)


OK. Я нашел проблему здесь. Проблема заключалась в том, что информация о вращении не отправлялась обратно в MainView. С этим легко справиться, если FlipView (который будет реагировать на эти сообщения об ориентации) повторно отправит сообщение в MainView. Мой код внутри FLipView раньше ничего не делал для сообщений о вращении (он автоматически обрабатывал вращение), но теперь я добавляю обработчик в FlipView следующим образом:

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
        [mainView willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; 
}

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

Следует заметить, что в коде выше у меня есть ссылка на mainView. Вам нужно будет передать это после alloc-init FlipView, чтобы убедиться, что вы можете сделать этот вызов, если это необходимо. Это означает добавление нового свойства в класс MainView в коде Flipview.

Я делаю что-то подобное в MainView перед открытием FlipView:

FlipsideViewController *controller = [[FlipsideViewController alloc] initWithNibName:@"FlipsideView" bundle:nil];


controller.delegate = self;
controller.mainView = self;
controller.lastIndexPath = lastIndex;
controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:controller animated:YES];

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

person Paul3333    schedule 24.01.2013