UINavigationController
とsegues
を使用したプロジェクトが正常に動作しています。それらはすべて正しく回転します。問題は...特定のautorotation
でUIViewController
を無効にするだけです。私はこれを試しました:
- (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
は自動的に回転し続けます。どんな助けでも歓迎します:)
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;
}
初心者向けの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"
以上です
この他のアプローチを見てください:
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 );
}
}
あなたのUIViewControllerにそれを実装してみてください:
// implements the interface orientation (iOS 6.x)
@interface UINavigationController (RotationNone)
-(NSUInteger)supportedInterfaceOrientations;
@end
@implementation UINavigationController (RotationNone)
-(NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
@end
私は誰かがこれについてSwiftで尋ねたのを見ます。 Objective-CのメソッドはSwiftのメソッドではなく、計算された変数なので、すぐにはわかりません。
override var shouldAutorotate: Bool { return false }
override var supportedInterfaceOrientations: UIInterfaceOrientationMask { return .portrait }