1

このスタックオーバーフローの投稿を見ました: shouldAutorotateToInterfaceOrientation is not working in iOS 6。その答えは、RotationIn_IOS6 というカテゴリを追加することでした。私はそれを行い、さまざまなビューコントローラーのビューが iOS6 で正しく機能しています。問題は iOS5 にあります。

すべての方向に回転するために必要なビューはいくつかだけで、残りは縦向きまたは PortraitUpsideDown にする必要があります。私が直面している問題は、すべてが回転しない(code1)か、横向きに回転した後、縦向きに戻るまで同じ向きのままである(code2)ことです。

コード 1:

@implementation UINavigationController (RotationIn_IOS6)
-(BOOL)shouldAutorotate
{
    return [[self.viewControllers lastObject] shouldAutorotate];
}

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

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

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{

        return UIInterfaceOrientationIsPortrait(interfaceOrientation);
}
@end

コード 2:

@implementation UINavigationController (RotationIn_IOS6)
-(BOOL)shouldAutorotate
{
    return [[self.viewControllers lastObject] shouldAutorotate];
}

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

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

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    if([self.visibleViewController isKindOfClass:[MyClassToRotate class]])
    {
         return [self.visibleViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
    }
    else
    {
        return UIInterfaceOrientationIsPortrait(interfaceOrientation);
    }

}

これに関するガイダンスが必要です。これを解決する方法がわかりません。

編集:

コード 3:

1) カテゴリから shouldAutorotateToInterfaceOrientation を削除しました。2)このコードを特定のクラスに追加しました

- (BOOL)shouldAutorotate
{
    //returns true if want to allow orientation change
    return TRUE;


}
- (NSUInteger)supportedInterfaceOrientations
{
    //decide number of origination tob supported by Viewcontroller.
    return UIInterfaceOrientationMaskAll;


}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    //from here you Should try to Preferred orientation for ViewController
    return TRUE;
}

結果 -> すべてのビューコントローラーが縦向きにロックされます。PortraitUpsideDown にアクセスできません。ビューコントローラーに入ると、回転できますが、ビューコントローラーから出ると、横向きにロックされます..

編集2:

各ビューコントローラーには次のコードが含まれています。

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


- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

- (BOOL)shouldAutorotate {
    return NO;
}
4

3 に答える 3

0

shouldAutorotateToInterfaceOrientation:iOS 5 の代わりに、ナビゲーション コントローラー カテゴリでオーバーライドする必要はありません。各ビュー コントローラーはshouldAutorotateToInterfaceOrientation:、サポートされている向きで実装する必要があります。コンテナ コントローラ(ナビゲーション コントローラ)によって決定されるサポートされている向きは、iOS6 以降のみです。下位バージョンではshouldAutorotateToInterfaceOrientation:、表示しようとしている子View Controllerの を呼び出します

于 2013-05-31T11:15:36.010 に答える
0

その問題を解決するために、カテゴリを使用する代わりに UINavigationController をサブクラス化しました。

MyNavigationcontroller.h

#import <UIKit/UIKit.h>
@interface MyNavigationcontroller : UINavigationController
@end 

MyNavigationcontroller.m

#import "MyNavigationcontroller.h"
@interface MyNavigationcontroller ()
@end

//Set your init...

-(BOOL)shouldAutorotate {
    if ([[self.viewControllers lastObject] isKindOfClass:NSClassFromString(@"YourClass")]) 
        return YES;
    }
        return NO;
}

-(NSUInteger)supportedInterfaceOrientations {

    if ([[self.viewControllers lastObject] isKindOfClass:NSClassFromString(@"YourClass")]) {
        return UIInterfaceOrientationMaskAll;
    }
        return UIInterfaceOrientationMaskPortraitUpsideDown;
}

@end

次に、各ビューコントローラーのオーバーライドで:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return (interfaceOrientation == UIInterfaceOrientationMaskPortraitUpsideDown);//or your orientation
}

次に、起動時に、didFinishLaunchingWithOptions:アプリのデリゲートで次のようにします。

NSString *reqSysVer = @"6.0";
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
    if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending) {
        self.navigationController = [[MyNavigationcontroller alloc] initWithRootViewController:masterViewController];//IOS 6
    }else{
        self.navigationController = [[UINavigationController alloc] initWithRootViewController:masterViewController];
    }
self.window.rootViewController = self.navigationController;
于 2013-05-31T11:37:06.143 に答える
0

最も簡単な方法は、Target->General->Deployment Info で、必要な向きにチェックを入れます。たとえば、縦向きのみにチェックを入れると、アプリは自動回転しません。

于 2014-01-05T00:32:16.420 に答える