Отображение модального вида с ориентацией, отличной от ориентации устройства - PullRequest
2 голосов
/ 16 декабря 2011

У меня есть приложение для iPhone, которое поддерживает все ориентации устройства, но у меня есть специальный модальный вид, который я хочу отображать только в альбомной ориентации.

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

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

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

[[UIApplication sharedApplication] setStatusBarOrientation: UIInterfaceOrientationLandscapeRight] также упоминается, но у меня естьникогда не видел, чтобы это имело какой-либо эффект, когда я пытался его использовать.

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

Я использую следующую логику для модального отображения моего вида:

    TitleViewController *titleController = [[TitleViewController alloc] initWithNibName:@"TitleViewController" bundle:[NSBundle mainBundle]];
    titleController.delegate = self;
    titleController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    [self presentModalViewController:titleController animated:YES];
    [titleController release];

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

ОБНОВЛЕНИЕ

Нашли решение, которое работает:

    if (self.interfaceOrientation == UIInterfaceOrientationPortrait)
    {
        self.view.transform = CGAffineTransformMakeRotation(degreesToRadians(90));
        self.view.bounds = CGRectMake(0.0, 0.0, 480, 320);
    }

Однако при работе с ориентацией UIInterfaceOrientationPortraitUpsideDown , первоначально отображает вид с правильной ориентацией, но затем перемещает его обратно вкнижная ориентация с обрезанными сторонами и отображение фона над и под изображением.

Я пытался настроить угол на 270, -90 и другие значения, но всегда возвращается к портрету, когда в UIInterfaceOrientationPortraitUpsideDown ориентация.

Почему?

Ответы [ 3 ]

2 голосов
/ 17 декабря 2011

Этот подход сделал все, что мне было нужно:

    if (self.interfaceOrientation == UIInterfaceOrientationPortrait)
    {
        self.view.transform = CGAffineTransformMakeRotation(degreesToRadians(90));
        self.view.bounds = CGRectMake(0.0, 0.0, 480, 320);
    }

    TitleViewController *titleController = [[TitleViewController alloc] initWithNibName:@"TitleViewController" bundle:[NSBundle mainBundle]];
    titleController.delegate = self;
    titleController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    [self presentModalViewController:titleController animated:YES];
    [titleController release];

Поверните ориентацию перед представлением моего модального вида.

И я только что удалил поддержку UIInterfaceOrientationPortraitUpsideDown с этой ориентациине был нужен.

1 голос
/ 17 декабря 2011

Вы пробовали:

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

А когда вы собираетесь уволить, смените его на Портрет

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortrait];
0 голосов
/ 16 декабря 2011

Решение 1: Чтобы изменить ориентацию запуска из исходного портретного режима, вам необходимо отредактировать файл info.plist. Добавьте запись для «первоначальной ориентации интерфейса» и установите желаемое значение.

Здесь - скриншот, где найти файл info.plist. (если ссылка не работает, пожалуйста, оставьте комментарий)


Решение 2: Вы также можете попробовать это в вашем контроллере навигации в качестве подпредставления к окну, а уведомления об ориентации отправляются только в первое подпредставление в «окне».

//.m file
- (BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    // Hide status bar
    application.statusBarHidden = YES;
        // --- Add the view controller's view to the window and display.
    [window addSubview:viewController.view];
    [viewController.view addSubview:navigationController.view];
    [window makeKeyAndVisible];
    return YES;
}
...