3

アプリにUiNavigationControllerがあります。1つの画面だけが回転できるようにしたいので、このクラスに入れます:

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return YES;
}

-(BOOL)shouldAutorotate {
    return YES;
}

-(NSInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAll;
}

しかし、発生する問題は、回転が発生するアプリのecery画面にあります。どうすれば無効にできますか?

4

5 に答える 5

10

iOS 6の場合、アプリで次のコードを使用しています。これにより、各ビューコントローラーの回転を個別に指定できます。

AppDelegate.m-

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{NSUInteger orientations =UIInterfaceOrientationMaskAllButUpsideDown;
if(self.window.rootViewController){
UIViewController *presentedViewController = [[(UINavigationController *)self.window.rootViewController viewControllers] lastObject];
orientations = [presentedViewController supportedInterfaceOrientations];
}
return orientations;
}

ViewController.m-

- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}

コードのクレジットは元々、RayWenderlichの「iOS6byTutorials」の本にあると思います。RayWenderlichのWebサイト

于 2013-01-27T14:35:18.457 に答える
1

自動回転のみするクラスでは、以下のコードを使用してください。

@interface UITabBarController (rotation)
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation;
- (NSUInteger)supportedInterfaceOrientations;
- (BOOL)shouldAutorotate;
@end


@implementation UITabBarController (rotation)
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {

    if ([self.selectedViewController isKindOfClass:[UINavigationController class]])
    {
        UINavigationController *navController = (UINavigationController *) self.selectedViewController;
        if ([[navController visibleViewController] isKindOfClass:[CLASS_NAME_FOR_ROTATION class]])
            return YES;
    }
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (NSUInteger)supportedInterfaceOrientations
{
    if ([self.selectedViewController isKindOfClass:[UINavigationController class]])
    {
        UINavigationController *navController = (UINavigationController *) self.selectedViewController;
        if ([[navController visibleViewController] isKindOfClass:[CLASS_NAME_FOR_ROTATION class]])
            return UIInterfaceOrientationMaskAll;
    }
    return UIInterfaceOrientationMaskPortrait;
}

- (BOOL)shouldAutorotate
{
    if ([self.selectedViewController isKindOfClass:[UINavigationController class]])
    {
        UINavigationController *navController = (UINavigationController *) self.selectedViewController;
        if ([[navController visibleViewController] isKindOfClass:[CLASS_NAME_FOR_ROTATION class]])
            return YES;
    }
    return NO;

}

@end

このコードは、回転するクラスの親View Controller(つまり、ナビゲーションコントローラーのスタック上の直前のクラス)で使用します。

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationPortrait;
}
于 2013-01-28T06:30:07.733 に答える
0

appDelegateにこのコードを追加します

@property(nonatomic,assign)BOOL shouldRotate;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    shouldRotate=NO;
}
-(void)shouldAutoRotate:(BOOL)rotate
{
    self.shouldRotate=rotate;
}

そして、rootviewコントローラーにこのコードを追加します

#import "AppDelegate.h"
#define myAppDelegate (AppDelegate *)[[UIApplication sharedApplication] delegate]

- (NSUInteger)supportedInterfaceOrientations
{
 if(![myAppDelegate shouldRotate])
     return UIInterfaceOrientationMaskPortrait;
 else
     return UIInterfaceOrientationMaskAllButUpsideDown;
}

その後、回転させたいviewcontroller.mにこのコードを追加します

- (void)viewDidLoad
{
    [super viewDidLoad];
    [myAppDelegate shouldAutoRotate:YES];
}

-(void)viewWillDisappear:(BOOL)animated
{
    [myAppDelegate shouldAutoRotate:NO];
}

私は私のプロジェクトの1つ(IOS 7)でこれを行いました。それは私にとって完璧に機能します。

于 2014-01-12T09:37:21.927 に答える
-1

カテゴリを作成して、navigationControllerのメソッドをオーバーライドし、すべてのクラスをサポートできます。

@implementation UINavigationController (Rotation_IOS6)

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

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

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}

@end

異なるコントローラーでの回転を制限する場合は、supportedInterfaceOrientationsをオーバーライドし、それぞれのビューコントローラーでshouldAutoroteを実行して、必要に応じて戻り値を変更します。

于 2013-01-27T12:20:36.210 に答える
-1
-(NSUInteger)supportedInterfaceOrientations
{
    return self.topViewController.supportedInterfaceOrientations;

}
于 2013-01-27T13:41:12.940 に答える