Есть ли документированный способ установки ориентации iPhone? - PullRequest
94 голосов
/ 08 октября 2008

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

Существует недокументированный установщик свойств в UIDevice, который делает свое дело, но, очевидно, генерирует предупреждение компилятора и может исчезнуть с будущей версией SDK.

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortrait];

Есть ли документированные способы форсирования ориентации?

Обновление: Я подумал, что приведу пример, так как я не ищу shouldAutorotateToInterfaceOrientation, поскольку я это уже реализовал.

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

Ответы [ 17 ]

1 голос
/ 13 января 2013

Решение для iOS 6:

[[[self window] rootViewController] presentViewController:[[UIViewController alloc] init] animated:NO completion:^{
    [[[self window] rootViewController] dismissViewControllerAnimated:NO completion:nil];
}];

Точный код зависит от приложения, а также от того, где вы его разместили (я использовал его в своем AppDelegate). Замените [[self window] rootViewController] тем, что вы используете. Я использовал UITabBarController.

1 голос
/ 05 июля 2012

Я решил это довольно легко в конце. Я перепробовал каждое предложение выше и все еще не получилось, так что это было мое решение:

В ViewController, который должен оставаться альбомным (влево или вправо), я слушаю изменения ориентации:

    [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(didRotate:)
                                             name:UIDeviceOrientationDidChangeNotification object:nil];

Тогда в didRotate:

- (void) didRotate:(NSNotification *)notification
{   if (orientationa == UIDeviceOrientationPortrait) 
    {
        if (hasRotated == NO) 
        {
            NSLog(@"Rotating to portait");
            hasRotated = YES;
            [UIView beginAnimations: @"" context:nil];
            [UIView setAnimationDuration: 0];
            self.view.transform = CGAffineTransformIdentity;
            self.view.transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(-90));
            self.view.bounds = CGRectMake(0.0f, 0.0f, 480.0f, 320.0f);
            self.view.frame = CGRectMake(0.0f, 0.0f, 480.0f, 320.0f);
            [UIView commitAnimations];

    }
}
else if (UIDeviceOrientationIsLandscape( orientationa))
{
    if (hasRotated) 
    {
        NSLog(@"Rotating to lands");
        hasRotated = NO;
        [UIView beginAnimations: @"" context:nil];
        [UIView setAnimationDuration: 0];
        self.view.transform = CGAffineTransformIdentity;
        self.view.transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(0));
        self.view.bounds = CGRectMake(0.0f, 0.0f, 320.0f, 480.0f);
        self.view.frame = CGRectMake(0.0f, 0.0f, 320.0f, 480.0f);
        [UIView commitAnimations];

    }
}

Имейте в виду любые Super Views / Subviews, которые используют автоматическое изменение размера, так как view.bounds / frame явно сбрасывается ...

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

1 голос
/ 03 октября 2011

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

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

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

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

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)pInterfaceOrientation {
    BOOL lHideNavBar = self.interfaceOrientation == UIInterfaceOrientationPortrait ? NO : YES;
    [self.navigationController setNavigationBarHidden:lHideNavBar animated:YES];
}

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

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

0 голосов
/ 08 октября 2008

Если вы используете UIViewControllers, есть этот метод:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

Возврат NO для контроллеров представления, содержащих представления, которые вы не хотите вращать.

Подробнее здесь

0 голосов
/ 10 октября 2008

Это то, что я использую. (Вы получаете некоторые предупреждения компиляции, но это работает как в симуляторе, так и в iPhone)

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];
[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
0 голосов
/ 10 сентября 2010

Я нашел решение и написал что-то по-французски (но код на английском). здесь

Способ состоит в том, чтобы добавить контроллер в окно (контроллер должен обладать хорошей реализацией функции shouldRotate ....).

0 голосов
/ 09 октября 2008

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

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