Как повернуть вид в ландшафт в приложении с вкладками - PullRequest
7 голосов
/ 11 февраля 2009

У меня есть приложение на основе вкладок.

В Интерфейсном Разработчике я строю 2 вида, один в портретном, а другой в альбомном режиме.

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

Я заставляю работать основную часть этого:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
                                duration:(NSTimeInterval)duration { 
    if (self.landscape) {
        if (toInterfaceOrientation == UIInterfaceOrientationPortrait)
        {
            self.view = self.portrait;
            self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(360));
        }
        else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft)
        {
            self.view = self.landscape;
            self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(-90));
        }
        else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)
        {
            self.view = self.landscape;
            self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
        }
        else
        {
            self.view = self.portrait;
            self.view.transform =  CGAffineTransformMakeRotation(degreesToRadian(-180));
        }
    }
}

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

Кроме того, я все еще не нашел способ скрыть все остальное ...

Ответы [ 5 ]

5 голосов
/ 30 ноября 2009

Посмотрите на пример кода Apple "AlternateViews".

Основная идея заключается в том, что вы можете определить физическую ориентацию устройства с помощью уведомлений, а затем активировать новый контроллер вида «модально» и заставить его запрашивать полный экран. Вы отключаете вращение интерфейса, имея shouldAutorotate ... возвращать YES только для одной ориентации, так как вы делаете все это вручную с уведомлениями. Когда вы изменяете физическую ориентацию, ваш модальный контроллер представления либо представлен, либо отклонен.

2 голосов
/ 11 февраля 2009

Вы можете скрыть строку состояния, позвонив

setStatusBarHidden:(BOOL)

по ссылке на UIApplication, вот так.

- (void)applicationDidFinishLaunching:(UIApplication *)application {

[application setStatusBarHidden:YES];

}

Чтобы избавиться от панели вкладок, вы можете сделать ссылку на ваш код в Интерфейсном конструкторе на ваш код и вызвать

[myUITabBar removeFromSuperview];

Это может сработать, хотя я не проверял это, что касается других вопросов, я не на 100%, не решал проблемы раньше.

1 голос
/ 15 ноября 2009

Кажется, что существует достаточное количество кодеров, которые хотят, чтобы элемент панели вкладок переводил их в полноэкранный режим просмотра (без строки состояния, без панели вкладок) и затем возвращался.

Я опубликовал запрос о том, возможно ли это на форуме разработчиков Apple, но пока не получил ответа.

Почему это сложно? (извините, вопрос новичка? Кажется, что некоторые довольно очевидные вещи не должны быть сложными) Никто из тех, кого я нашел в Интернете, не имеет четкого ответа на этот вопрос.

1 голос
/ 14 ноября 2009

Когда я смотрю на приложение iPod, мне кажется, что представление TabBarController не заменяется и не изменяется каким-либо образом. Я думаю, что между представлением tabbarcontroller и представлением coverflow существует только постепенный переход.

На вашем месте, я бы попробовал (не уверен, что это могло бы работать) с контроллером Coverflow, его вид отображался в верхней части представления tabBarController. Если бы помешал tabBarController автоматически изменять его представление, но в этот момент я бы уменьшил его представление и исчезнул в представлении coverflow, которое было бы только в альбомной ориентации.

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

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

1 голос
/ 11 февраля 2009

Хорошо, это то, насколько я положил это на работу:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
                                duration:(NSTimeInterval)duration {
    if (self.landscape) {
        if (toInterfaceOrientation == UIInterfaceOrientationPortrait)
        {
            self.view = self.portrait;
            //self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(360));
        }
        else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft)
        {
            self.view = self.landscape;
            //self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(-90));
        }
        else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)
        {
            self.view = self.landscape;
            //self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
        }
        else
        {
            self.view = self.portrait;
            //self.view.transform =  CGAffineTransformMakeRotation(degreesToRadian(-180));
        }
    }
}

Теперь в AppDelegate:

- (void) didRotate:(NSNotification *)notification
{   
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
    [UIView beginAnimations:nil context:NULL];  

    if (orientation == UIDeviceOrientationLandscapeLeft || orientation == UIDeviceOrientationLandscapeRight)
    {
        [tabBarController.view setAlpha:0.0];
        [tabBarController.view removeFromSuperview];

        [[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO]; 
    } else {
        [tabBarController.view setAlpha:1.0];
        [[UIApplication sharedApplication] setStatusBarHidden:NO animated:NO];      
    }
    [UIView commitAnimations];  
}

Но тогда как установить текущий вид и как восстановить панель вкладок?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...