Альтернативный ландшафт срабатывает при нежелательном просмотре

У меня есть контроллер представления, который содержит изображение и табличное представление. Из этого контроллера представления я подключил переход к горизонтальному представлению, которое содержит изображение в полноэкранном режиме (та же идея используется, когда вы переворачиваете приложение «Акции» от Apple, чтобы увидеть график в полноэкранном режиме).

Этот переход вызывается следующим методом:

- (void)updateLandscapeView
{
    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
    if (UIDeviceOrientationIsLandscape(deviceOrientation) && !isShowingLandscapeView)
    {
        [self performSegueWithIdentifier: @"toGraph" sender: self];
        isShowingLandscapeView = YES;
    }
    else if (deviceOrientation == UIDeviceOrientationPortrait && isShowingLandscapeView)
    {
        [self dismissViewControllerAnimated:YES completion:nil];
        isShowingLandscapeView = NO;
    }
}

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

Заранее спасибо!


person Juan Andres    schedule 01.02.2013    source источник


Ответы (1)


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

Вот что я сделал в (я думаю) подобной ситуации:

AppDelegate:

in .h:

@property (nonatomic) BOOL shouldAutorotate;

in .m:

// в didFinishLaunchingWithOptions:

self.shouldAutorotate = NO;

// все еще в .m файле

// Autorotation handling
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    return self.shouldAutorotate ?
    UIInterfaceOrientationMaskAllButUpsideDown :
    UIInterfaceOrientationMaskPortrait;
}

Навигационный контроллер представляет портретный контроллер

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (NSUInteger)supportedInterfaceOrientations
{
    if (self.selectedViewController)
        return [self.selectedViewController supportedInterfaceOrientations];

    return UIInterfaceOrientationMaskPortrait;
}

- (BOOL)shouldAutorotate
{
    return YES;
}

Контроллер портретного просмотра (здесь также очень похожая обработка перехода, которая у вас есть):

в поле зренияWillAppear:

[(AppDelegate *)[[UIApplication sharedApplication] delegate] setShouldAutorotate:YES];

обработка вращения:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (BOOL)shouldAutorotate
{
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

Контроллер ландшафтного вида (возможно, ваше полноэкранное изображение):

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskLandscape;
}

Глубже в иерархии навигационного контроллера (где нужен только портрет):

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (BOOL)shouldAutorotate
{
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

Выглядит как-то сложно, но это был единственный способ, мне удалось заставить эти повороты правильно работать как в iOS5, так и в 6.

person d4Rk    schedule 01.02.2013
comment
Я думаю, вы прекрасно поняли!... но я не понимаю, что означает эта строка кода: [(AppDelegate *)[[UIApplication sharedApplication] delegate] setShouldAutorotate:YES]; - person Juan Andres; 01.02.2013
comment
Это установит для свойства shouldAutorotate в AppDelegate значение YES. Таким образом, это должно активировать автоповорот для одного портретного контроллера, от которого отделяется ландшафтный контроллер. - person d4Rk; 01.02.2013
comment
Когда я помещаю эту строку кода в свой проект, он сообщает мне об использовании необъявленного идентификатора: AppDelegate, что мне не хватает? Извините, что беспокою вас, но я все еще новичок в программировании. - person Juan Andres; 01.02.2013
comment
Вы поставили @property (nonatomic) BOOL shouldAutorotate; в файле заголовка AppDelegate? И вы #import AppDelegate в своем контроллере портретного вида? - person d4Rk; 01.02.2013
comment
О, я не импортировал AppDelegate!!... Теперь я это сделал, но альбомный вид продолжает отображаться на каждом уровне навигационной иерархии :( должен быть какой-то код, противоречащий тому, что вы предложили (что выглядит довольно аккуратно)... Я еще немного покопаюсь в коде, который мне нужно было увидеть, в чем проблема. Спасибо! - person Juan Andres; 02.02.2013
comment
Я только что обновил свой ответ в соответствии с тем, что у меня есть в контроллере навигации (представляя контроллер портретного вида) для поворота. Может быть, это исправит это для вас. - person d4Rk; 02.02.2013