はShouldAutorotateToInterfaceOrientation
iOS 6 で廃止され、特定のビューを強制的に縦向きにするためにそれを使用しましたが、iOS 6 でこれを行う正しい方法は何ですか? これは私のアプリの 1 つの領域のみであり、他のすべてのビューは回転できます。
16 に答える
すべてのナビゲーション コントローラーがトップ ビュー コントローラーを尊重するようにしたい場合は、カテゴリを使用できるので、一連のクラス名を調べて変更する必要はありません。
@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
コメントのいくつかが指摘しているように、これは問題の迅速な修正です。より良い解決策は、UINavigationController をサブクラス化し、これらのメソッドをそこに配置することです。サブクラスは、6 と 7 のサポートにも役立ちます。
iOS6の最良の方法は、RayWenderlichチームによる「iOS6ByTutorials」(http://www.raywenderlich.com/)に具体的に記載されており、UINavigationController
ほとんどの場合、サブクラス化よりも優れています。
初期のViewControllerUINavigationController
としてセットを含むストーリーボードでiOS6を使用しています。
//AppDelegate.m-残念ながら、このメソッドはiOS6より前では利用できません
- (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;
}
//MyViewController.m-それぞれに対してサポートしたい方向を返しますUIViewController
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}
この回答は、OP の投稿のコメントで尋ねられた質問に関連しています。
ビューを特定の方向に強制的に表示するには、viewWillAppear に次のように記述します。
UIApplication* application = [UIApplication sharedApplication];
if (application.statusBarOrientation != UIInterfaceOrientationPortrait)
{
UIViewController *c = [[UIViewController alloc]init];
[self presentModalViewController:c animated:NO];
[self dismissModalViewControllerAnimated:NO];
}
ちょっとしたハックですが、これによりUIViewController
、以前のコントローラーが横向きだった場合でも、縦向きで表示されるようになります
iOS7のアップデート
上記の方法は廃止されたため、iOS 7 では次の方法を使用します。
UIApplication* application = [UIApplication sharedApplication];
if (application.statusBarOrientation != UIInterfaceOrientationPortrait)
{
UIViewController *c = [[UIViewController alloc]init];
[c.view setBackgroundColor:[UIColor redColor]];
[self.navigationController presentViewController:c animated:NO completion:^{
[self.navigationController dismissViewControllerAnimated:YES completion:^{
}];
}];
}
興味深いことに、執筆時点では、現在または却下のいずれかをアニメーション化する必要があります。どちらでもない場合は、白い画面が表示されます。なぜこれが機能するのかわかりませんが、機能します! どちらをアニメートするかによって視覚効果が異なります。
そのため、縦向きのみのモーダルビューを表示するときに同じ問題に遭遇しました。通常、 を作成し、を としてUINavigationController
設定し、 をモーダル ビューとして表示します。しかし、iOS 6 では、はサポートされているインターフェイスの向きを navigationController に尋ねるようになりました (デフォルトでは、すべてが iPad 用で、上下逆になっているものはすべて iPhone 用です)。viewController
rootViewController
UINavigationController
viewController
解決策: 自動回転メソッドをサブクラス化UINavigationController
してオーバーライドする必要がありました。ちょっと足が不自由です。
- (BOOL)shouldAutorotate {
return NO;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
// pre-iOS 6 support
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
}
IOS 5
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
IOS 6
-(BOOL)shouldAutorotate{
return YES;
}
-(NSInteger)supportedInterfaceOrientations{
// UIInterfaceOrientationMaskLandscape;
// 24
//
// UIInterfaceOrientationMaskLandscapeLeft;
// 16
//
// UIInterfaceOrientationMaskLandscapeRight;
// 8
//
// UIInterfaceOrientationMaskPortrait;
// 2
// return UIInterfaceOrientationMaskPortrait;
// or
return 2;
}
UIViewController 回転メソッドはカテゴリ自体で宣言されているため、別のカテゴリでオーバーライドすると未定義の動作が発生するため、@aprato の回答には同意しません。UINavigationController (または UITabBarController) サブクラスでそれらをオーバーライドする方が安全です
また、これは、横向きビューから縦向きのみの VC へのプッシュ/提示/ポップ、またはその逆のシナリオをカバーしていません。この困難な問題 (Apple が対処したことはありません) を解決するには、次のことを行う必要があります。
iOS <= 4 および iOS >= 6 の場合:
UIViewController *vc = [[UIViewController alloc]init];
[self presentModalViewController:vc animated:NO];
[self dismissModalViewControllerAnimated:NO];
[vc release];
iOS 5 の場合:
UIWindow *window = [[UIApplication sharedApplication] keyWindow];
UIView *view = [window.subviews objectAtIndex:0];
[view removeFromSuperview];
[window addSubview:view];
これらは、すべての shouldAutorotate 、 supportedInterfaceOrientations などを再評価することを UIKit に強制します。
ここで退屈することはありませんが、サブクラスを共有していただけませんか?ありがとうございました。
編集:まあ、私はついにそれをしました、サブクラスは行うのがとても簡単でした。デフォルトの代わりにとしnavigationController
てを宣言し、サブクラスを次のように変更する必要がありました。AppDelegate
UINavigationControllerSubclass
UINavigationController
- (BOOL)shouldAutorotate {
return _shouldRotate;
}
を呼び出すことで、回転するかどうかに関係なく、任意のビューを設定できます。viewDidLoad
_navController = (UINavigationController *)self.navigationController;
[_navController setShouldRotate : YES / NO]
この調整が他の人にも役立つことを願っています、あなたのヒントに感謝します!
ヒント:を活用する
- (NSUInteger)supportedInterfaceOrientations
ビューコントローラで使用するため、縦向きで目的のビューを横向きにしたり、その逆を行ったりすることはありません。
UISplitViewController と UISegmentedController を使用する比較的複雑なユニバーサル アプリがあり、presentViewController
. 上記の方法を使用して、iPhone ios 5 および 6 を許容範囲内で動作させることができましたが、何らかの理由で iPad がランドスケープとしての表示を拒否しました。最後に、デバイスとios 5および6の両方で機能する簡単な解決策(何時間もの読書と試行錯誤の後に実装された)を見つけました.
ステップ 1) コントローラーで、必要な方向を指定します (多かれ少なかれ上記のとおりです)。
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}
-(BOOL)shouldAutorotate
{
return YES;
}
-(NSUInteger)supportedInterfaceOrientations
{
NSInteger mask = UIInterfaceOrientationMaskLandscape;
return mask;
}
ステップ 2) シンプルな UINavigationController サブクラスを作成し、次のメソッドを実装します。
-(BOOL)shouldAutorotate {
return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskLandscape;
}
ステップ 3) viewController を提示する
vc = [[MyViewController alloc]init];
MyLandscapeNavigationController *myNavigationController = [[MyLandscapeNavigationController alloc] initWithRootViewController:vc];
[self myNavigationController animated:YES completion:nil];
これが誰かに役立つことを願っています。
私はそれを自分でテストしませんでしたが、ドキュメントには、これらのメソッドをオーバーライドできると記載されています:supportedInterfaceOrientations
およびpreferredInterfaceOrientationForPresentation
。
あなたはおそらくあなたが望むものを達成することができますyそれらの方法であなたが望む方向だけを設定します。
UINavigationController および UITabBarController クラス内で VC を許可するサブクラスまたはカテゴリを使用した回答はうまく機能します。横向きのタブ バー コントローラーから縦向きのみのモーダルを起動すると失敗しました。これを行う必要がある場合は、アニメーション化されていないモーダル ビューを表示および非表示にするトリックを使用しますが、それは viewDidAppear メソッドで行います。viewDidLoad または viewWillAppear ではうまくいきませんでした。
それとは別に、上記のソリューションは正常に機能します。
多くの回答が表示されますが、向きに関する特定のアイデアと回答は得られませんが、向きをよく理解し、ios6 の強制的な回転を削除するリンクが表示されます。
http://www.disalvotech.com/blog/app-development/iphone/ios-6-rotation-solution/
ヘルプフルだと思います。
project.plist に移動して、サポートされているインターフェイスの向きを追加し、ポートレート (下部のホーム ボタン) とポートレート (上部のホーム ボタン) のみを追加します。
プロジェクトの要件に従って、向きを追加または削除できます。
ありがとう
1)プロジェクト設定とinfo.plistをチェックし、必要な方向のみが選択されていることを確認します。
2)最上位のビューコントローラー(ナビゲーションコントローラー/タブバーコントローラー)に次のメソッドを追加します
- (NSUInteger) supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait;
}
3)アプリデリゲートに次のメソッドを追加します
- (NSUInteger) supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait;
}
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
return UIInterfaceOrientationMaskPortrait;
}
ViewController
これを、回転させたくないそれぞれの .m ファイルに入れます。
- (NSUInteger)supportedInterfaceOrientations
{
//return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft;
return UIInterfaceOrientationMaskPortrait;
}
詳しくはこちらをご覧ください。