web-dev-qa-db-ja.com

iOS6の単一のUIViewControllerで自動回転を無効にします

UINavigationControllerseguesを使用したプロジェクトが正常に動作しています。それらはすべて正しく回転します。問題は...特定のautorotationUIViewControllerを無効にするだけです。私はこれを試しました:

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

// New Autorotation support for iOS 6.
- (BOOL)shouldAutorotate NS_AVAILABLE_IOS(6_0){
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

しかし、それは機能していません、私のUIViewControllerは自動的に回転し続けます。どんな助けでも歓迎します:)

19
Jesús Ayala

View Controllerプログラミングガイドごと

自動回転を一時的に無効にする場合は、方向マスクを操作しないでください。代わりに、最初のView ControllerでshouldAutorotateメソッドをオーバーライドします。このメソッドは、自動回転を実行する前に呼び出されます。 NOが返された場合、回転は抑制されています。

したがって、「UINavigationController」をサブクラス化し、shouldAutorotateを実装し、ストーリーボードでNavigation Controllerクラスを使用する必要があります。

- (BOOL)shouldAutorotate
{
    id currentViewController = self.topViewController;

    if ([currentViewController isKindOfClass:[DetailViewController class]])
        return NO;

    return YES;
}
35
GayleDDS

初心者向けのGayleDDSの答えを完成させるつもりで、次のようにUINavigationControllerのサブクラスを追加しました。

#import "UINavigationController.h"
#import "MonthCalendarVC.h"

@implementation UINavigationController (overrides)
- (BOOL)shouldAutorotate
{
    id currentViewController = self.topViewController;

    if ([currentViewController isKindOfClass:[MonthCalendarVC class]])
        return NO;

    return YES;
}
@end

MonthCalendarVCは、縦長モード(固定)にしたいviewControllerであり、appdelegate.mにインポートを追加しました

#import "UINavigationController.h"

以上です

15
Jesús Ayala

この他のアプローチを見てください:

http://www.sebastianborggrewe.de/only-make-one-single-view-controller-rotate/

回転を許可するには、ViewControllerにcanRotateを実装する必要があります。

IOS 7で正常に動作します。

2015-01-30sebastianのサイトは機能していないようです(404エラー)ので、これはその解決策の私の解釈です:

セバスチャンとは異なり、プロトコル(C#のインターフェイスなど)を使用して、各View Controllerでメソッド「-(void)canrotate:」を作成しないようにします。

IRotationCapabilities.h
-----------------------

#ifndef Nice_APPS_IRotationCapabilities_h
#define Nice_APPS_IRotationCapabilities_h

@protocol IRotationCapabilities < NSObject >

// Empty protocol

@end

#endif


FirstViewController.h
---------------------

- ( void )viewWillAppear:( BOOL )animated
{
    [ super viewWillAppear:animated ];

    // Forces the portrait orientation, if needed
    if( ![ self conformsToProtocol:@protocol( IRotationCapabilities ) ] )
    {
        if( self.navigationController.interfaceOrientation != UIInterfaceOrientationPortrait )
        {
            [ [ UIDevice currentDevice ] setValue:@( 1 ) forKey:@"orientation" ];
        }
    }
}

SecondViewController.h
-----------------------

#import "IRotationCapabilities.h"

@interface SecondViewController : UIViewController < IRotationCapabilities >


AppDelegate.m
-------------

#pragma mark - Orientation management

- ( NSUInteger )application:( UIApplication * )application supportedInterfaceOrientationsForWindow:( UIWindow * )window
{

    if( __iPhone )
    {
        // Gets topmost/visible view controller
        UIViewController * currentViewController = [ self topViewController ];

        // Checks whether it implements rotation
        if( [ currentViewController conformsToProtocol:@protocol( IRotationCapabilities ) ] )
        {
            // Unlock landscape view orientations for this view controller
            return ( UIInterfaceOrientationMaskAllButUpsideDown );
        }

        // Allows only portrait orientation (standard behavior)
        return ( UIInterfaceOrientationMaskPortrait );
    }
    else
    {
        // Unlock landscape view orientations for iPad
        return ( UIInterfaceOrientationMaskAll );
    }
}
5
Christophe

あなたのUIViewControllerにそれを実装してみてください:

// implements the interface orientation (iOS 6.x)
@interface UINavigationController (RotationNone)
-(NSUInteger)supportedInterfaceOrientations;
@end

@implementation UINavigationController (RotationNone)
-(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}
@end
4
zero3nna

私は誰かがこれについてSwiftで尋ねたのを見ます。 Objective-CのメソッドはSwiftのメソッドではなく、計算された変数なので、すぐにはわかりません。

override var shouldAutorotate: Bool { return false }
override var supportedInterfaceOrientations: UIInterfaceOrientationMask { return .portrait }
0
Grimxn