iOS: автоповорот между NIB - PullRequest
       5

iOS: автоповорот между NIB

2 голосов
/ 25 сентября 2010

Мое универсальное приложение представляет собой один полноэкранный режим.Нажатие кнопки переворачивает, чтобы открыть страницу настроек:

- (void) showSettings
{
FlipsideViewController * flipsideVC = [FlipsideViewController alloc];

NSString * settingsNib;
if ( isIPad() )
    settingsNib = isCurrentlyPortrait() ? @"settings_iPad_portrait" : @"settings_iPad_landscape";
else
     settingsNib = @"settings_iPhone";

[flipsideVC initWithNibName: settingsNib
                     bundle: nil ];

flipsideVC.delegatePointingToMainVC = self;

flipsideVC.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;

[self presentModalViewController: flipsideVC 
                        animated: YES ];

[flipsideVC release];
}

, и страница настроек вызывает метод делегата: я воссоздаю основной вид в свете измененных настроек и переворачиваюсь назад.

- (void) settingsDidQuit:(FlipsideViewController *) flipsideVC 
{
[self createOrRecreateWheelView];
[self dismissModalViewControllerAnimated: YES];
}

Но что, если пользователь поворачивает iPad на странице настроек?Apple постановляет, что мое приложение должно справиться с этим.Но как это сделать?я могу динамически загрузить новый XIB для страницы настроек?

Я не вижу способа сделать это, поэтому моя попытка решить эту проблему - перехватить поворот в представлении настроек, ...

- (void) didRotateFromInterfaceOrientation: (UIInterfaceOrientation) oldInterfaceOrientation 
{
[self.delegatePointingToMainVC settingsOrientationChanged]; 
}

... и перезвонить наконтроллер основного вида, который распускает контроллер представления настроек и воссоздает его в свете текущей ориентации.

- (void) settingsOrientationChanged
{
[self dismissModalViewControllerAnimated: YES];
[self showSettings];
}

Тут сразу возникает тривиальная проблема - didRotateFromInterfaceOrientation запускается автоматически при загрузке страницы настроек.Я могу предотвратить это, установив логическое значение false в init и изменив таким образом:

- (void) didRotateFromInterfaceOrientation: (UIInterfaceOrientation) oldInterfaceOrientation 
{
if (initialized)
    [self.delegatePointingToMainVC settingsOrientationChanged]; 

initialized = true;
}

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

Я думаю, что здесь есть проблема с многопоточностью.Но, возможно, весь мой подход неверен.Может кто-нибудь предложить лучшее решение?

1 Ответ

2 голосов
/ 25 сентября 2010

Я не уверен, что понимаю проблему. Вы хотите, чтобы представление настроек (загруженное из NIB) автоматически поворачивалось? Вам просто нужно вернуть YES для ориентации, которую вы хотите, чтобы авторотация выполняла в shouldAutorotateToInterfaceOrientation: и установить маску авторазмера размеров представлений внутри XIB в соответствии с вашими потребностями.

Нет необходимости перезванивать контроллеру основного вида и говорить ему нажать новый контроллер вида настроек. Поворот представлений определяется свойствами маски автоматического изменения размера каждого представления и реализацией метода shouldAutorotateToInterfaceOrientation: соответствующего контроллера представления и только этого. Однако, если вы хотите создавать более сложные анимации, вы можете настроить и управлять ими в willRotateToInterfaceOrientation: duration: и didRotateFromInterfaceOrientation: методов.

...