現在、App Store にはほぼランドスケープのみの iPad アプリケーションがあり、回転ロックを処理する新しい iOS 6 の方法にいくつかの問題があります。
これは UINavigationController ベースのアプリケーションであり、iOS がほとんどの責任を処理するため、rootViewController
各UIWindow
UIViewController に必要な回転を手動で尋ねる必要があります。
非常に大量のUIViewController
s があるため、各コントローラーにコードを手動で追加してこれを行うには時間がかかります。そのため、これらの呼び出しをオーバーライドするために UINavigationController と UIViewController の両方を拡張し、必要なビューを手動で設定できます。ポートレートをブロックする相手と許可するポートレート。
UINavigationController-Extension.m:
//
// UINavigationController-Extension.m
// DrivingInstructor
//
// Created by Liam Nichols on 06/12/2012.
// Copyright (c) 2012 Liam Nichols. All rights reserved.
//
#import "UINavigationController-Extension.h"
@implementation UINavigationController (Extension)
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return [self.topViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}
-(NSUInteger)supportedInterfaceOrientations
{
return self.topViewController.supportedInterfaceOrientations;
}
-(BOOL)shouldAutorotate
{
return YES;
}
@end
@implementation UIViewController (Extension)
-(BOOL)shouldAutorotate
{
return NO;
}
-(NSUInteger)supportedInterfaceOrientations
{
if ([[self portraitClasses] containsObject:NSStringFromClass([self class])])
{
return UIInterfaceOrientationMaskAll;
}
return UIInterfaceOrientationMaskLandscape;
}
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
if ([[self portraitClasses] containsObject:NSStringFromClass([self class])])
{
return YES;
}
return (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight);
}
-(NSArray*)portraitClasses
{
static NSArray *classes;
if (classes == nil)
{
classes = @[ @"MockTestController", @"PLUILibraryViewController", @"PhotoViewController" ];
}
return classes;
}
@end
最初は、これで問題が解決したと思いました(また、info.plistでアプリを横向きにロックしたままにして、横向きに起動し、アプリデリゲートで呼び出しapplication:supportedInterfaceOrientationsForWindow:
てすべての向きを返し、選択したビューが縦向きにアクセスできるようにしました必要に応じて。
したがって、これは機能しているようで、lanscape にロックされているすべてのビュー コントローラーは、拡張機能クラスで指定した 3 を受け入れます。オリエンテーション。
ただし、私が見つけて修正できないように見える1つの問題は、たとえば、許可されたビューコントローラーで縦向きにあり、横向きにロックされている前のビューコントローラーにポップバックしようとするsupportedInterfaceOrientations
と、二度と呼び出されず、ビューランドスケープにロックする必要がありますが、そうではありません (これにより問題が発生します)。
リンゴのドキュメントに従って、回転を処理する責任が rootViewController に渡され、ユーザーがデバイスを回転させておらず、rootViewController が変更されていないため、要求する必要がないため、これがどのように機能するかsupportedInterfaceOrientations
..
私の質問は、アプリケーションに強制的に電話をかける方法はありますか、それとも別のsupportedInterfaceOrientations
方法で行うべきですか?
読んでくれてありがとう。この最後のバグの解決策を見つけることができれば、このコードは同じ状況にある人々への良い参考になるかもしれません。
- - -編集 - - -
viewWillAppear:
さらに調査を行っていたところ、実際には関数の直前に、supportedInterfaceOrientations
実際に私がポップバックしようとしているコントローラーで呼び出され、正しいマスクUIInterfaceOrientationMaskLandscape
を返してポートレートから自動的に回転させようとしていることがわかりましたが、そうではないようですこの応答を聞いても、まだUIViewController
縦向きのままです...
つまり、supportedInterfaceOrientations
もう一度 を呼び出す必要はありませんが、代わりにデバイスを回転させて横向きに戻します。