わかりました、皆さん、私は私の解決策を投稿します。
私が持っているもの:
- いくつかのビュー コントローラーを備えたビュー ベースのアプリケーション。(これはナビゲーション ベースでしたが、向きの問題により、ビュー ベースにする必要がありました)。
- すべてのビュー コントローラは、1 つを除いて縦向きです - 横向きの左。
タスク:
- ユーザーがデバイスをどのように保持していても、View Controller の 1 つは自動的に横向きに回転する必要があります。他のすべてのコントローラーは縦向きである必要があり、横向きのコントローラーを離れた後、ユーザーがデバイスをどのように持っているかに関係なく、アプリは強制的に縦向きに回転する必要があります。
- これは、IOS 5.x と同様に IOS 6.x でも機能する必要があります。
行け!
(更新は@Ivan Vučicaによって提案されたマクロを削除しました)
すべての PORTRAIT ビュー コントローラーで、次のように自動回転メソッドをオーバーライドします。
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{
return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
}
-(BOOL)shouldAutorotate {
return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
2 つのアプローチを確認できます。1 つは IOS 5 用で、もう 1 つは IOS 6 用です。
LANDSCAPE ビュー コントローラについても同じですが、いくつかの追加と変更があります。
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{
[image_signature setImage:[self resizeImage:image_signature.image]];
return (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft);
}
-(BOOL)shouldAutorotate {
return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
[image_signature setImage:[self resizeImage:image_signature.image]];
return UIInterfaceOrientationMaskLandscapeLeft;
}
注意: IOS 5で自動回転を強制するには、次を追加する必要があります。
- (void)viewDidLoad{
[super viewDidLoad];
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 6.0)
[[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationLandscapeLeft animated:NO];
}
同様に、LANDSCAPE コントローラーを離れた後、ロードするコントローラーが何であれ、IOS 5 の自動回転を再度強制する必要がありますがUIDeviceOrientationPortrait
、PORTRAIT コントローラーに移動するときに を使用します。
- (void)viewDidLoad{
[super viewDidLoad];
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 6.0)
[[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationPortrait animated:NO];
}
最後に (少し奇妙ですが)、IOS に応じて、コントローラーから別のコントローラーに切り替える方法を変更する必要があります。
NSObject クラス "Schalter" (ドイツ語の "Switch") を作成します。
Schalter.h で次のように言います。
#import <Foundation/Foundation.h>
@interface Schalter : NSObject
+ (void)loadController:(UIViewController*)VControllerToLoad andRelease:(UIViewController*)VControllerToRelease;
@end
Schalter.m で次のように言います。
#import "Schalter.h"
#import "AppDelegate.h"
@implementation Schalter
+ (void)loadController:(UIViewController*)VControllerToLoad andRelease:(UIViewController*)VControllerToRelease{
//adjust the frame of the new controller
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
CGRect windowFrame = [[UIScreen mainScreen] bounds];
CGRect firstViewFrame = CGRectMake(statusBarFrame.origin.x, statusBarFrame.size.height, windowFrame.size.width, windowFrame.size.height - statusBarFrame.size.height);
VControllerToLoad.view.frame = firstViewFrame;
//check version and go
if (IOS_OLDER_THAN_6)
[((AppDelegate*)[UIApplication sharedApplication].delegate).window addSubview:VControllerToLoad.view];
else
[((AppDelegate*)[UIApplication sharedApplication].delegate).window setRootViewController:VControllerToLoad];
//kill the previous view controller
[VControllerToRelease.view removeFromSuperview];
}
@end
今、これは Schalter を使用する方法です (倉庫コントローラーから製品コントローラーに移動するとします):
#import "Warehouse.h"
#import "Products.h"
@implementation Warehouse
Products *instance_to_products;
- (void)goToProducts{
instance_to_products = [[Products alloc] init];
[Schalter loadController:instance_to_products andRelease:self];
}
bla-bla-bla your methods
@end
もちろん、instance_to_products
オブジェクトを解放する必要があります:
- (void)dealloc{
[instance_to_products release];
[super dealloc];
}
さて、これです。反対票を投じることをためらわないでください、私は気にしません。これは、評判ではなく、解決策を探している人向けです。乾杯!サヴァ・マザレ。