Как заставить определенную UIInterfaceOrientation для отдельного представления в UINavigationController? - PullRequest
21 голосов
/ 20 мая 2011

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

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

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

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

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

Ответы [ 8 ]

9 голосов
/ 18 февраля 2013

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

Для поворота устройства вы можете использовать следующие методы:

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];

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

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

[[UIDevice currentDevice] performSelector:NSSelectorFromString(@"setOrientation:")
                                       withObject:(__bridge id)((void*)UIInterfaceOrientationLandscapeLeft)];
6 голосов
/ 24 августа 2011

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

4 голосов
/ 24 августа 2011

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

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

1 голос
/ 20 мая 2011

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

0 голосов
/ 31 мая 2013

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] вызывает поворот строки состояния, но не приводит к повороту представления.

0 голосов
/ 08 апреля 2013

У меня есть приложение, которое имеет только ландшафтные виды, которые даже начинаются в альбомной ориентации.Это работало нормально в 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.Исходный код, который у меня был, был добавлением подпредставления (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;
}
0 голосов
/ 23 августа 2011

Это может быть то, что вы ищете.

// Rotates the view.
CGAffineTransform transform = CGAffineTransformMakeRotation(3.14159/2);
self.view.transform = transform;

// Repositions and resizes the view.
CGRect contentRect = CGRectMake(-80, 80, 480, 320);
self.view.bounds = contentRect;

от http://www.iphonedevsdk.com/forum/iphone-sdk-development/1394-landscape-uiviewcontroller-uiview-rotation.html

0 голосов
/ 22 августа 2011

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

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationLandscapeRight || interfaceOrientation == UIInterfaceOrientationLandscapeLeft);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...