Есть ли способ заставить изменить ориентацию интерфейса в iPhone?

Я знаю, как разрешить/запретить поворот ориентации с помощью

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

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

Вот что я пытаюсь сделать:

  • Приложение поворачивается в любую и все ориентации. Все нормально.

  • Происходит событие.

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

Просто чтобы усложнить ситуацию, я хочу вывести UIAlertView (я знаю, как это сделать) перед принудительным вращением, сообщая пользователю, что происходит, и я хочу скрыться за alertView для поворота, но не для alertView. Это вообще возможно?

Спасибо.


person iClavdivs    schedule 14.06.2011    source источник


Ответы (5)


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

person Prav    schedule 10.04.2013

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
        return (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown || interfaceOrientation == UIInterfaceOrientationLandscapeRight || interfaceOrientation == UIInterfaceOrientationLandscapeLeft);
    }


    // orientation view swapping logic
- (void)didRotate:(NSNotification *)notification {


    UIDeviceOrientation newOrientation = [[UIDevice currentDevice] orientation];
    if (newOrientation != UIDeviceOrientationUnknown || newOrientation != UIDeviceOrientationFaceUp || newOrientation != UIDeviceOrientationFaceDown) 
    {
           orientation = newOrientation;

    }

    // Write your orientation logic here
        if ((orientation == UIDeviceOrientationLandscapeLeft || orientation == UIDeviceOrientationLandscapeRight)) 
    {
     // Clear the current view and insert the orientation specific view.
         [self clearCurrentView];
         [self.view insertSubview:yourLandscapeView atIndex:0];

    } else if (orientation == UIDeviceOrientationPortrait || orientation == UIDeviceOrientationPortraitUpsideDown) 
    {
           // Clear the current view and insert the orientation specific view.
            [self clearCurrentView];
            [self.view insertSubview:yourPortraitView atIndex:0];

     }
}

и добавьте это уведомление в событие

person vipul    schedule 19.03.2013

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

person ColemanCDA    schedule 26.03.2013

Согласно Apple, если вы не хотите, чтобы поведение по умолчанию, предоставляемое API поворота устройства, выполнялось следующим образом:

Вы можете контролировать:

  • Ориентации, поддерживаемые вашим приложением
  • Как вращение между двумя ориентациями анимируется на экране.

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

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

См. документы здесь об изменениях ротации:

http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/RespondingtoDeviceOrientationChanges/RespondingtoDeviceOrientationChanges.html

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

person Aaron    schedule 14.04.2013

да, ты можешь это сделать. что вам нужно сделать, так это в методе -(void) viewwillappear просто включить следующий код

if (self.interfaceOrientation == <current orientation>) {
        [[UIDevice currentDevice] performSelector:NSSelectorFromString(@"setOrientation:") withObject:(id)<to which orientation you want to change.>];
    }

это решит вашу проблему

person Bharath    schedule 05.07.2012
comment
Этот API скрыт, свойство ориентации для экземпляров UIDevice доступно только для чтения, поэтому это может вызвать проблемы во время процесса проверки Apple. - person Marco Grassi; 03.10.2012
comment
Для ‹на какую ориентацию вы хотите изменить› тип UIInterfaceOrientation нельзя привести к id. Каков обходной путь? - person schellsan; 16.01.2013