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

Вопросы вращения UITabBarController в ios 6

Ack! У меня были проблемы с вращением на вкладке, которые были разрешены, наконец, в iOS 5, но iOS 6 и xcode, похоже, сломали вещи... вот что я имею:

Целевая информация о приложении включает в себя: Поддерживаемые интерфейсные ориентации - Портреты, Пейзаж слева, Пейзаж справа

Каждый Single View в приложении имеет следующие методы:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
    return ((interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown) &&
            (interfaceOrientation != UIInterfaceOrientationLandscapeLeft) &&
            (interfaceOrientation != UIInterfaceOrientationLandscapeRight));
} else {
    return YES;
}
}

- (BOOL)shouldAutorotate
{
NSLog(@"am I called1?");
return NO;
}

-(NSUInteger)supportedInterfaceOrientations{
   NSLog(@"am I called?");
   return UIInterfaceOrientationMaskPortrait;
}

В представлениях, которые не являются частью панели вкладок, вращение блокируется. Во ВСЕХ представлениях на вкладке (есть 5) приложение никогда не вызывает ShouldAutorotate и поэтому вращается. Кажется, он поддерживается .InterfaceOrientations вызывается один раз при загрузке представления, но не тогда, когда он появляется, если я переключаюсь между представлениями, потому что я получаю NSLog, но, похоже, игнорирует параметр MaskPortrait.

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

Является ли это ошибкой на вкладке в iOS 6? Нужно ли мне отключать вращение просмотров по-разному? В авторизованном интерфейсе ориентация работала отлично в ios 5

Я был на нем какое-то время

Спасибо, Zack

4b9b3361

Ответ 1

Зак, я столкнулся с этой проблемой. Это связано с тем, что у вас есть viewController, встроенный внутри контроллера TabBar или UINavigationController, и вызовы этих методов происходят внутри них вместо обычного View (измененного в iOS6).

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

Мое простое исправление заключалось в создании CATEGORY для UINavigationController, который включает в себя эти два метода. Мне нужно, чтобы Autorotate возвращал NO, потому что я не хочу, чтобы мои модальные представления вращались. Ваше исправление может быть таким простым, попробуйте. Надеюсь, что это поможет.

Я создал категорию и назвал ее autoRotate и выбрал опциюUINavigationController. Файл M + H находится ниже.

#import "UINavigationController+autoRotate.h"

@implementation UINavigationController (autoRotate)

-(BOOL)shouldAutorotate {
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

@end

... и категория .h:

#import <UIKit/UIKit.h>

@interface UINavigationController (autoRotate)

-(BOOL)shouldAutorotate;
- (NSUInteger)supportedInterfaceOrientations;

@end

Ответ 2

Если у вас есть панель вкладок, как я, единственное, что вам нужно сделать, это добавить следующее в файл делегата .m,

#import "AppDelegate.h"

//UITabBarController category to set the view rotations for ios 6
@implementation UITabBarController (Background)

-(BOOL)shouldAutorotate
{
    //I don't want to support auto rotate, but you can return any value you want here
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations {
    //I want to only support portrait mode
    return UIInterfaceOrientationMaskPortrait;
}

@end


/////here starts the implementation of the app delegate which is gonna be whatever you currently have on your .m delegate

@implementation AppDelegate

// delegate methods and other stuff

@end

Ответ 3

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

Я создаю класс UINavigationController, называемый RootNavigationController, и назначил этот класс как пользовательский класс для навигационных контроллеров в раскадровке. В RootNavigationController.m я добавил следующие методы:

- (BOOL)shouldAutorotate {

    return [self.visibleViewController shouldAutorotate];
}

- (NSUInteger)supportedInterfaceOrientations {
    return [self.visibleViewController supportedInterfaceOrientations];    
}

В каждом файле контроллера .m файл я также добавил следующие методы.

- (BOOL)shouldAutorotate {
    //return yes or no
}

- (NSUInteger)supportedInterfaceOrientations{
    //return supported orientation masks
}

Это позволяет мне настроить ориентацию для каждого вида в своем контроллере вида.

Работал для меня в любом случае...

Ответ 4

Моя ситуация:

  • UITabBarController имеет 2 элемента: 2 Контроллер навигации
  • UINavigationController1 withRootView: ViewController1
  • UINavigationController2 withRootView: ViewController2.
  • Теперь я хочу, чтобы ViewController1 установил shouldAutorotate: NO/maskPortrait и ViewController2 set shouldAutorotate/MaskAll.

Итак, мой инструмент: Создать категорию UITabBarController и категорию UINavigationCntroller, например

UITabBarController + autoRotate.h

@interface UITabBarController (autoRotate)

-(BOOL)shouldAutorotate;
- (NSUInteger)supportedInterfaceOrientations;

@end

UITabBarController + autoRotate.m

#import "UITabBarController+autoRotate.h"

@implementation UITabBarController (autoRotate)

- (BOOL)shouldAutorotate {
    return [self.selectedViewController shouldAutorotate];
}
- (NSUInteger)supportedInterfaceOrientations {
    return [self.selectedViewController supportedInterfaceOrientations];
}

@end

UINavigationController + autoRotate.h

@interface UINavigationController (autoRotate)

-(BOOL)shouldAutorotate;
- (NSUInteger)supportedInterfaceOrientations;

@end

UINavigationController + autoRotate.m

@implementation UINavigationController (autoRotate)

- (BOOL)shouldAutorotate {
    return [self.visibleViewController shouldAutorotate];
}

- (NSUInteger)supportedInterfaceOrientations {
    return [self.visibleViewController supportedInterfaceOrientations];
}

@end

UIViewController1.m

- (BOOL)shouldAutorotate {
    return NO;
}
- (NSUInteger)supportedInterfaceOrientations {
   return UIInterfaceOrientationMaskPortrait;;
}

UIViewController2.m

- (BOOL)shouldAutorotate {
   return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
   return UIInterfaceOrientationMaskAll;
}

Он работал как шарм!

Ответ 5

В моем случае у меня был контроллер навигации, встроенный в UITabBarController, и то, что работало, создавало такую ​​категорию, как Kunani, но расширило UITabBarController вместо UINavigationController. Он работал как шарм:)

#import "UINavigationController+autoRotate.h"

@implementation UINavigationController (autoRotate)

-(BOOL)shouldAutorotate {
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

@end

И .h файл:

#import <UIKit/UIKit.h>

@interface UINavigationController (autoRotate)

-(BOOL)shouldAutorotate;
- (NSUInteger)supportedInterfaceOrientations;

@end

Ответ 6

Это будет сделано в Swift

extension UITabBarController {
    public override func shouldAutorotate() -> Bool {
        if let selected = self.selectedViewController {
            return selected.shouldAutorotate()
        } else {
            return false
        }
    }

    public override func supportedInterfaceOrientations() -> Int {
        if let selected = self.selectedViewController {
            return selected.supportedInterfaceOrientations()
        } else {
            return Int(UIInterfaceOrientationMask.Portrait.rawValue)
        }
    }
}

extension UINavigationController {
    public override func shouldAutorotate() -> Bool {
        return self.visibleViewController.shouldAutorotate()
    }

    public override func supportedInterfaceOrientations() -> Int {
        return self.visibleViewController.supportedInterfaceOrientations()
    }
}

Ответ 7

fooobar.com/questions/97480/...

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

fooobar.com/questions/97480/...

Ответ 8

Вы должны добавить эту вещь в UIViewController1.m, чтобы убедиться, что предыдущий статус ориентации восстановлен:

 (void)viewDidAppear:(BOOL)animated 
{

    [[UIDevice currentDevice] performSelector:NSSelectorFromString(@"setOrientation:") 
    withObject:(id)UIInterfaceOrientationPortrait];
}

Perfect!