it-swarm.com.ru

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

Итак, вот ситуация:

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

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

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

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

21
NovaJoe

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

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

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];

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

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

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

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

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

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

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

4
mdizzle

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

1
quarac

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

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

У меня есть приложение, которое имеет только ландшафтные виды, которые даже начинаются в альбомной ориентации. Это работало нормально в 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
Moonwalker

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
Peter

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

// 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
apple16