Подтвердить что ты не робот

Как принудительно настроить отдельную UIInterfaceOrientation на индивидуальном представлении в UINavigationController?

Хорошо, так вот ситуация:

У меня есть приложение, в котором я хочу только ОДНОГО конкретного представления в UINavigationController иметь ориентацию ландшафта. Это представление UIImageView, в котором я записываю подпись (эта часть работает потрясающе). Итак, вот так:

previous view --> signature view --> next view
 (portrait)        (landscape)       (portrait)

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

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

4b9b3361

Ответ 1

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

Чтобы повернуть устройство, вы можете использовать следующие методы:

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];

Но в нем может не работать во всех ситуациях...

Также доступен недокументированный подход:

[[UIDevice currentDevice] performSelector:NSSelectorFromString(@"setOrientation:")
                                       withObject:(__bridge id)((void*)UIInterfaceOrientationLandscapeLeft)];

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

Я думаю, вы можете встроить это представление в контроллер представления и перезаписать метод ShouldRotateToInterfaceOrientation. Удачи!

Ответ 5

Чтобы использовать представление только в ландшафте, в ViewController есть следующее:

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

Ответ 7

У меня есть приложение, в котором есть только пейзажи, которые даже начинаются в ландшафте. Это отлично работает в iOS 5.x, но перестало работать в iOS 6.x

После многого другого, более сомнительного, чем другие, я нашел решение, которое для меня ясное и предсказуемое.

Я сделал несколько вещей.

- Я сохранил представления в ландшафтном режиме в IB.

- Я проверил оба ландшафтных режима в настройках проекта - там четыре значка для управления им

- Ориентация mgmt изменилась в iOS 6.x. Я должен был перезаписать несколько методов, чтобы поддержать изменение ландшафта.

этот метод предназначен для iOS 5.x

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{
    // Return YES for supported orientations.
    return (interfaceOrientation & UIInterfaceOrientationMaskLandscape);
}

эти 2 метода предназначены для iOS 6.x

- (NSUInteger)supportedInterfaceOrientations
{
    NSUInteger supportedOrientations = UIInterfaceOrientationMaskLandscape;
    return supportedOrientations;
}


- (BOOL)shouldAutorotate
{
    return YES;
}

- Но ключ должен был изменить логику в AppDelegate. Первоначальный код, который у меня был, добавлял к окну subview (controller.view). Это перестало работать в iOS 6.x - я изменил вызов на window.setRootController. Это был последний шаг, который закрепил его - он не сработает, не сделав этого окончательного изменения

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{        
    //[self.window addSubview:viewController.view];
    [self.window setRootViewController:viewController];
    [self.window makeKeyAndVisible];


    return YES;
}

Ответ 8

UINavigationController переопределяет настройки ориентации UIViewController, поэтому вам нужно создать собственный подкласс UINavigationController со следующим для 5.1:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    if ([[self topViewController] isKindOfClass:[SigCaptureViewController class]]) {
        return UIInterfaceOrientationIsLandscape(interfaceOrientation);
    } else {
        return UIInterfaceOrientationIsPortrait(interfaceOrientation);
    }
}

Для версии 6.0 и выше вам необходимо:

- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
    if ([[self topViewController] isKindOfClass:[EXTRASigCaptureViewController class]]) {
        return UIInterfaceOrientationMaskLandscape;
    } else {
        return UIInterfaceOrientationMaskPortrait;
    }
}

Я не понял, как заставить вращение UINavigationController вращаться. вызов [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:NO] заставляет строку состояния вращаться, но не приводит к вращению представления.