iOS 7までの私のアプリは正しく動作します。私は今日Xcode 6でそれを試しました、そしてそれを実行すると私は厄介な驚きがあります:(:
XcodeがmyViewControllerを縦長モードであるかのように描画していることがわかりますが、横長モードであることがわかります。
IOS 8で何が変更されたか知っていますか? :/私は次の方向付け方法を使用しました:
編集:
私はこの方法を発見しました:
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
return UIInterfaceOrientationMaskLandscape;
}
そして今私の最初のviewcontrollersは正しく動作します:)。問題は、(UIInterfaceOrientationMaskAllのメソッドのセットを変更する)モーダルを表示したときに、スクリーンショットの醜い効果を作り直すことです。正確に私はこのモードで私のメソッドを変更します:
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
if(self.restrictRotation)
{
return UIInterfaceOrientationMaskLandscape;
}
else
{
return UIInterfaceOrientationMaskAll;
}
}
// THIS IS A DELEGATE OF MODAL VIEW CONTROLLER
- (void)updateInterfaceAfterDocumentPreviewViewController
{
NSLog(@"updateInterfaceAfterDocumentPreviewViewController");
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft];
AppDelegate* appDelegate = (AppDelegate*)[UIApplication sharedApplication].delegate;
appDelegate.restrictRotation = YES;
}
次のコードを試してください
didFinishLaunchingWithOptions
/AppDelegate
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
[self.window setFrame:[[UIScreen mainScreen] bounds]]; //Add
問題は、ウィンドウを設定するときの呼び出しの順序のようです。アプリデリゲートのmakeKeyAndVisible
メソッドでrootViewController
を割り当てる前に、didFinishLaunchingWithOptions
を呼び出す必要があります。次の作品:
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
[self.window makeKeyAndVisible];
self.window.rootViewController = self.myMainViewController;
ただし、順序を次のように変更した場合:
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.rootViewController = self.myMainViewController;
[self.window makeKeyAndVisible];
あなたはあなたが経験している行動を得る。
.plistファイルを見てください。
「読み込み画面」でもまったく同じ問題が発生しました。これは私のために働いたものです。 (ご注意ください:私のアプリはiOS 7以降、横向きモードのみをサポートしています):
CGRect theFrame = self.view.frame;
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.0) {
CGRect screenBounds = [[UIScreen mainScreen] bounds];
theFrame.Origin = CGPointZero;
theFrame.size.width = screenBounds.size.height;
theFrame.size.height = screenBounds.size.width;
}
NSLog(@"%@", [NSNumber valueWithCGRect:theFrame]);
self.loadingScreen = [[UIView alloc] initWithFrame:theFrame];
アプリが縦向きをサポートしている場合、および「正しいapplicationFrameを計算するための長い道のり」については、Mike Hayの回答を参照してください。 https://stackoverflow.com/a/18072095/4108485
お役に立てれば。
私は同様の問題を抱えていて、正しい起動画像を表示できなかった(iPadにはDefault-Portrait.pngとDefault-Landscape.pngの2つがあった)し、アプリ自体を自動方向付けすることもできませんでした。起動画像が消えた後。
起動画像の問題を解決するには:
最初のViewControllerでアプリの向きの問題を解決するには:
オールドスクールソリューション:
BOOL portrait;
BOOL iOS8OrLater = ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0);
if (iOS8OrLater) {
CGFloat height = CGRectGetHeight(self.view.frame);
CGFloat width = CGRectGetWidth(self.view.frame);
if (width / height > 1.0) {
portrait = NO;
} else {
portrait = YES;
}
} else {
portrait = UIInterfaceOrientationIsPortrait(self.interfaceOrientation);
}
if(portrait) {
[self layoutPortrait];
} else {
[self layoutLandscape];
}
これはviewWillLayoutSubviewsで呼び出すことができます
方向を検出するためのそのアプローチは iOS8 で廃止されました(ただし、今のところ許可されています)。これは、サイズクラスと Traitコレクション の概念に置き換えられました。
(奇妙なことに、現時点ではオンラインのAppleのドキュメントでサイズクラスリファレンスを見つけることができないようです-以前にあったと断言します-多分XCodeで)。 WWDCビデオについては こちらをご覧ください
とにかく、インターフェイスビルダーには「 Use Size Classes 」というチェックボックスがあります。チェックされている可能性があります。それをオフにして、それが役立つかどうかを確認しますか?
UIInterfaceOrientation currentOrientation = [UIApplication sharedApplication].statusBarOrientation;
if( UIDeviceOrientationIsLandscape( currentOrientation ) )
{
if( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad )
{
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait];
// -- Fix for rotation issue for ios 8
if( IS_IOS_8_OR_LATER )
{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad"
bundle: nil];
// -- Set frame of nav controller
UINavigationController *nc = [storyboard instantiateViewControllerWithIdentifier:@"NavController"];
self.window.rootViewController = nc;
[self.window setFrame:[[UIScreen mainScreen] bounds]];
// -- Set fame of home view controller
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"Home"];
self.window.rootViewController = vc;
[self.window makeKeyAndVisible];
[self.window setFrame:[[UIScreen mainScreen] bounds]];
}
}
}