Хотите использовать несколько перьев для разных ориентаций интерфейса iphone - PullRequest
5 голосов
/ 24 сентября 2010

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

common viewController

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

Сейчас я использую

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Override to allow orientations other than the default portrait orientation.
if(interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight ){
    [self initWithNibName:@"LandscapeNib" bundle:nil];
}else if(interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown){
    [self initWithNibName:@"PortraitNib" bundle:nil];

}


return YES;

}

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

Ответы [ 4 ]

6 голосов
/ 24 сентября 2010

Вам следует создать специальный view-контроллер для ландшафтного режима и представить его модально при вращении устройства.Чтобы получать уведомления при повороте устройства, зарегистрируйтесь для получения уведомлений UIDeviceOrientationDidChangeNotification.

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

http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/BasicViewControllers/BasicViewControllers.html#//apple_ref/doc/uid/TP40007457-CH101-SW26

Вот фрагмент из документации Apple.Зарегистрируйтесь для получения уведомлений в вашем init или awakeFromNib:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
   [[NSNotificationCenter defaultCenter] addObserver:self
                             selector:@selector(orientationChanged:)
                             name:UIDeviceOrientationDidChangeNotification
                             object:nil];

и в directionChanged представьте ваш контроллер ландшафтного вида модально или отклоните его, все в соответствии с текущим вращением:

- (void)orientationChanged:(NSNotification *)notification
{
    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
    if (UIDeviceOrientationIsLandscape(deviceOrientation) &&
        !isShowingLandscapeView)
    {
        [self presentModalViewController:self.landscapeViewController
                                animated:YES];
        isShowingLandscapeView = YES;
    }
    else if (deviceOrientation == UIDeviceOrientationPortrait &&
             isShowingLandscapeView)
    {
        [self dismissModalViewControllerAnimated:YES];
        isShowingLandscapeView = NO;
    }
}
5 голосов
/ 24 сентября 2010

shouldAutorotateToInterfaceOrientation: должен просто вернуться с ДА или НЕТ. По моему опыту, это не очень хорошая идея, чтобы делать какие-либо расширенные обработки здесь. Из документов:

Ваша реализация этого метода должен просто вернуть ДА или НЕТ на основе на значение в Параметр interfaceOrientation. Не делайте попытаться получить значение Свойство interfaceOrientation или проверка значение ориентации сообщается UIDevice класс. Ваш контроллер просмотра либо способен поддерживать заданная ориентация или нет.

Лучшее место для загрузки перьев в ответ на ротацию устройства:

willRotateToInterfaceOrientation:duration: или didRotateToInterfaceOrientation:

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

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

При вращении вам необходимо:

  1. Используйте loadNibNamed:owner:options: для загрузить перо вручную в NSArray. (См. документацию ).
  2. Установить self.view для объекта по индексу 0 из этого массива.
0 голосов
/ 30 мая 2012

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

см. Объяснение здесь

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

...