This repository has been archived by the owner on Jun 20, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 336
2.4 Supporting Multiple Interface Orientations
Koya Tamura edited this page May 14, 2013
·
19 revisions
View Controller Programming Guide for iOS
iPhone の複数の向きに対応する方法を説明します。
まずアプリを作成する前に、
- このアプリはどの方向に対応させるのか
- 回転対応する場合、どの画面を回転対応させるのか
- 回転中のアニメーションはどうするのか を考えましょう。
回転対応させる方法は大きく分けて二つあります。
- ViewController 内で回転時に再レイアウトする
- Portrait 用 Landscape 用の二つの ViewController を用意する
下の完成系を目指します。
- プロジェクトファイルの summary でサポートする回転を設定
- 回転させたい ViewController で回転宣言
注意 : iOS6 と iOS5 以前では大きく挙動が変わります。
- iOS6
// [1] rootViewController から回転通知が各 ViewController に通達される
// 各 ViewController は自身が回転に対応するかどうかを返答する
//only iOS6 書かなくても project summary で設定している方向に回転する(plist 優先)
-(NSUInteger)supportedInterfaceOrientations
{
NSLog(@"rotate support on ios6");
return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscape;
}
- iOS5 以前
// only iOS5 and earlier
// 書いていないと回転対応できない。project summary (plist) で宣言していなくても回転する
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
NSLog(@"rotate support on ios5 and earlier");
if ((toInterfaceOrientation == UIInterfaceOrientationPortrait)
|| (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft)
|| (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight))
{
return YES;
}
return NO;
}
static CGRect const kPortraitBuleViewRect = { { 32.0f, 18.0f }, { 150.0f, 150.0f } };
static CGRect const kLandscapeBuleViewRect = { { 18.0f, 32.0f }, { 150.0f, 150.0f } };
static CGRect const kPortraitYellowViewRect = { { 32.0f, 185.0f }, { 150.0f, 150.0f } };
static CGRect const kLandscapeYellowViewRect = { { 185.0f, 32.0f }, { 150.0f, 150.0f } };
// [2] view の描画
-(void)viewWillLayoutSubviews
{
NSLog(@"will layout subviews");
}
// [3] 回転前処理
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
duration:(NSTimeInterval)duration
{
NSLog(@"will rotate");
}
// [4] 回転する場合任意のアニメーションをここで設定
-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
duration:(NSTimeInterval)duration
{
NSLog(@"will animate");
if (toInterfaceOrientation == UIInterfaceOrientationPortrait) {
[_blueView setFrame:kPortraitBuleViewRect];
[_yellowView setFrame:kPortraitYellowViewRect];
} else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight
|| toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft)
{
[_blueView setFrame:kLandscapeBuleViewRect];
[_yellowView setFrame:kLandscapeYellowViewRect];
}
}
// [5] 回転完了処理
-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
NSLog(@"did rotate");
}
同じモデルを使って portrait, landscape の view を表現する必要がある場合、二つの ViewController を実装して出し分けるとシンプルに対応できます。
下の完成系を目指します。
MixiViewController.m
#import "MixiLandscapeViewController.h"
@interface MixiViewController ()
@property (nonatomic, strong) MixiLandscapeViewController *landscapeVC;
@end
@implementation MixiViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// UIDevice オブジェクトからの回転通知生成を宣言
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
// UIDevice からの通知受け取り登録
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(orientationChanged:)
name:UIDeviceOrientationDidChangeNotification
object:nil];
_landscapeVC = [[MixiLandscapeViewController alloc] initWithNibName:@"MixiLandscapeViewController" bundle:nil];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
// 通知時のメソッド
- (void)orientationChanged:(NSNotification *)notification
{
UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
if (UIDeviceOrientationIsLandscape(deviceOrientation))
{
[self presentViewController:_landscapeVC animated:NO completion:nil];
}
else if (UIDeviceOrientationIsPortrait(deviceOrientation))
{
[self dismissViewControllerAnimated:NO completion:nil];
}
}
// for iOS6
-(BOOL)shouldAutorotate
{
return NO;
}
MixiLandscapeViewController.m
// for iOS5 and earlier
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
return UIInterfaceOrientationIsLandscape(toInterfaceOrientation);
}
はじめに
-
導入
-
1.3 UIViewController1 UIViewController のカスタマイズ(xib, autoresizing)
-
UIKit 1 - container, rotate-
-
UIKit 2- UIView -
-
UIKit 3 - table view -
-
UIKit 4 - image and text -
-
ネットワーク処理
-
ローカルキャッシュと通知
-
Blocks, GCD
-
設計とデザインパターン
-
開発ツール
-
テスト
-
In-App Purchase
-
付録