iOS 画面回転関連のメモ

iOS6以降の回転設定

  • xcodeのプロジェクト設定内の「device orientation」の設定
  • root view controller の  shouldAutorotateとsupportedInterfaceOrientationsが返す値
  • 上記2つのアンド値で回転可能な方向が決まる

	// 回転可否の指定
	- (BOOL)shouldAutorotate {
	    return YES;
	}

	// 回転可能方向の指定
	#if __IPHONE_OS_VERSION_MAX_ALLOWED < 90000//ios8以下の場合
		- (NSUInteger)supportedInterfaceOrientations
	#else //ios9以降の場合
		- (UIInterfaceOrientationMask)supportedInterfaceOrientations
	#endif
	{
	    return UIInterfaceOrientationMaskAll;//全方向
	}

	// 初期画面方向
	- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
	    return UIInterfaceOrientationPortrait; //ポートレイト
	}

	// ios5回転可能方向の指定
	- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)orientation {
	    return YES;//全方向
	}
	

iOS7以前の画面回転の検出

  • 回転後:viewDidLoadで以下のメソッドを登録
	[[NSNotificationCenterdefaultCenter] addObserver:self selector:@selector(deviceDidRotate:) name:UIDeviceOrientationDidChangeNotificationobject:nil];
  • 登録したメソッド(deviceDidRotate)で回転に対応した処理を記述
	- (void)deviceDidRotate:(NSNotification*)note{
		UIDeviceOrientation orientation = [note.objectorientation];
		switch(orientation){
			caseUIDeviceOrientationPortrait: …以下省略

iOS8以降の画面回転の検出

iPhoneのみ(iPadでは、縦横ともサイズクラスがレギュラーのため検出不可)

  • 回転前
 - (void)willTransitionToTraitCollection:(UITraitCollection *)newCollection withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator; { 
}
  • 回転後
	- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection{
	}

iPadでも検出可

	- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id)coordinator {
		[coordinator animateAlongsideTransition:^(id context) {
		//回転前
		 } completion:^(id context){
		//回転後
		}];

		[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
	}

サイズクラスの判定

        if(self.traitCollection.verticalSizeClass == UIUserInterfaceSizeClassCompact){
           //縦方向のサイズがCompactの場合
        }else{
           //縦方向のサイズがCompact以外の場合
        } 

現在の回転方向の検出

	UIInterfaceOrientation orientation = [[UIApplicationsharedApplication] statusBarOrientation];