Skip to content
This repository has been archived by the owner on Jun 20, 2023. It is now read-only.

2.4 Supporting Multiple Interface Orientations

Koya Tamura edited this page May 14, 2013 · 19 revisions

View Controller Programming Guide for iOS

orientations View Controller Programming Guide for iOS から引用

iPhone の複数の向きに対応する方法を説明します。

まずアプリを作成する前に、

  • このアプリはどの方向に対応させるのか
  • 回転対応する場合、どの画面を回転対応させるのか
  • 回転中のアニメーションはどうするのか を考えましょう。

回転対応させる方法は大きく分けて二つあります。

  • ViewController 内で回転時に再レイアウトする
  • Portrait 用 Landscape 用の二つの ViewController を用意する

ViewController 内で回転時に再レイアウトする

下の完成系を目指します。

goal1

回転処理の流れ

rotateProcess

View Controller Programming Guide for iOS から引用

回転方向の宣言

  1. プロジェクトファイルの summary でサポートする回転を設定 rotateSetting
  2. 回転させたい 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 用の二つの ViewController を用意する

同じモデルを使って portrait, landscape の view を表現する必要がある場合、二つの ViewController を実装して出し分けるとシンプルに対応できます。

下の完成系を目指します。

goal2

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. iOSについて

  2. Xcode最初のステッフ

  3. 導入

  4. Objective C の基礎

  5. メモリ管理

  6. 1.3 UIViewController1 UIViewController のカスタマイズ(xib, autoresizing)

  7. 1.3 UIViewController1 UIViewController のカスタマイズ(storyboard)

  8. UIViewController2 - ModalViewController

  9. UIViewController2 - ModalViewController(storyboard)

  10. UIViewController3 - ライフサイクル

  11. HomeWork 1 Objective C の基本文法

  12. HomeWork 2 UIViewControllerとModalViewController

  13. HomeWork 3 UIViewController + Animation

  14. UIKit 1 - container, rotate-

  15. UINavigationController

  16. UITabController

  17. Custom Container View Controller

  18. Supporting Multiple Interface Orientations

  19. HomeWork 1 - タブバーからモーダルビューを表示する

  20. HomeWork 2 - NavigationController

  21. HomeWork 2.3 デバイスことに回転対応

  22. UIKit 2- UIView -

  23. UIView

  24. UIView のカスタマイズ

  25. UIView Animation

  26. HomeWork 1 - UIScrollView

  27. UIKit 3 - table view -

  28. UITableView について

  29. UITableViewとNavigationController

  30. custom UITableViewCell の作成

  31. UITableViewのその他のオプション、カスタマイズ

  32. HomeWork 1 - Dynamic height with a custom uitableviewcell

  33. UIKit 4 - image and text -

  34. UIImagePickerController

  35. Assets Library

  36. UITextFiled, UITextView

  37. KeyboardNotification

  38. Homework 1 - フォトの複数枚選択

  39. ネットワーク処理

  40. NSURLConnection

  41. JSONのシリアライズとデシリアライズ

  42. UIWebView

  43. ローカルキャッシュと通知

  44. NSUserDefaults, Settings Bundle

  45. NSFileManager

  46. Key Value Observing

  47. NSNotification、NSNotificationCenter を用いた通知

  48. UILocalNotification

  49. Blocks, GCD

  50. Blocks

  51. GCD

  52. 【演習】GCD,-Blocksを用いたHTTPリクエストマネージャの作成

  53. 設計とデザインパターン

  54. クラス設計 1

  55. クラス設計 2

  56. [クラス設計演習] (https://github.com/mixi-inc/iOSTraining/wiki/9.3-%E3%82%AF%E3%83%A9%E3%82%B9%E8%A8%AD%E8%A8%88%E6%BC%94%E7%BF%92)

  57. 開発ツール

  58. Instruments, デバッガ

  59. CocoaPods

  60. テスト

  61. iOS開発におけるテスト

  62. GHUnit

  63. Kiwi

  64. KIF

  65. In-App Purchase

  66. In-App Purchase

  67. 付録

  68. Tips of Xcode

  69. Auto Layout 入門

  70. Auto Layout ドリル

Edit sidebar

Clone this wiki locally