iPadプログラムの複雑なインターフェイスの自動回転

ほとんどのiPhoneおよびiPod touchプログラムは、縦向きのみをサポートしています。 多くの開発者は、本当に必要な場所にランドスケープ(ランドスケープ)方向を追加することすら考えていませんでした。 Appleも例外ではありません。iPhoneOS 2.xでは、重要なシステムプログラムでのランドスケープ(ランドスケープ)方向のサポートを実現せずに最良の例を提供しませんでした(iPhone OS 3.xでは、会社が誤りを修正しました)。



iPadの登場により、状況は変わりました。 Appleは、すべての開発者がiPadプログラムですべてのデバイスの向きをサポートすることを義務付けています。 当然、たとえばゲームなどの例外が存在する場合があります。 ただし、方向に対する厳密なバインド(機能)を持たないプログラムは、デバイスのどの位置でもユーザーにとって使いやすいはずです。



シンプルなインターフェースで、困難はありません。 UIViewクラスのオブジェクトは、フレームの変更を記述する必要なautoresizingMaskプロパティで設定されます。 複雑なインターフェースの場合、この方法はもはや適切ではありません。



layoutSubviewsメソッドを使用して、プログラムインターフェイスのスムーズで快適な自動回転を作成する方法を説明します。 この方法に関する詳細情報は、 iPadプログラミングガイドで入手できます。 私はその使用の実際の実際的な例を与えるだけです(この点に関してはAppleのドキュメントはけちです)。



これは選択肢の1つですが、彼の仕事の結果は非常に高品質です。 当然、このオプションはiPadおよびiPhone / iPod touchに適しています。



次のポートレートビューとランドスケープ(ランドスケープ)ビューが必要だとします。







最終プロジェクトRotateDemoをすぐに広めます。



そしてビデオ:





iPad(ウィンドウベース)用の基本プロジェクトを作成しましょう。



私はインターフェイス全体をプログラムで行うことに慣れています。 必要に応じて、Interface Builderでマウスのクリックでコードの一部を簡単に置き換えることができます。



クラスファイルContainerView(UIViewから派生)をプロジェクトに追加します。 今のところ空のままにしておきます。 このクラスのオブジェクトは、コントローラー内のすべてのUIViewオブジェクトのコンテナーになります。 このクラスでは、layoutSubviewsメソッドを再割り当てします。



クラスファイルDemoViewController(UIViewControllerから派生)を作成します。



インターフェイスファイルDemoViewController.h:



#import <UIKit/UIKit.h>

#import "ContainerView.h"



@ interface DemoViewController : UIViewController

{

ContainerView *containerView;

}



@end



* This source code was highlighted with Source Code Highlighter .








クラスの実装では、1つの主要なloadViewメソッドのみが重要です。



- ( void )loadView

{

CGRect screenRect = [[UIScreen mainScreen] applicationFrame];



UIView *contentView = [[UIView alloc] initWithFrame:screenRect];

contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;

contentView.backgroundColor = [UIColor blueColor];

self.view = contentView;

[contentView release];



containerView = [[ContainerView alloc] initWithFrame:CGRectMake(0, 0, screenRect.size.width, screenRect.size.height)];

containerView.backgroundColor = [UIColor blueColor];

containerView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;

[self.view addSubview:containerView];



UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];

button1.frame = CGRectZero;

[button1 setTitle: @"Object 1" forState:UIControlStateNormal];

button1.tag = 1001;

[containerView addSubview:button1];



UIButton *button2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];

button2.frame = CGRectZero;

[button2 setTitle: @"Object 2" forState:UIControlStateNormal];

button2.tag = 1002;

[containerView addSubview:button2];



UIButton *button3 = [UIButton buttonWithType:UIButtonTypeRoundedRect];

button3.frame = CGRectZero;

[button3 setTitle: @"Object 3" forState:UIControlStateNormal];

button3.tag = 1003;

[containerView addSubview:button3];



UIButton *button4 = [UIButton buttonWithType:UIButtonTypeRoundedRect];

button4.frame = CGRectZero;

[button4 setTitle: @"Object 4" forState:UIControlStateNormal];

button4.tag = 1004;

[containerView addSubview:button4];

}



* This source code was highlighted with Source Code Highlighter .








ここではすべてが簡単です。 コンテナを作成し、すべての要素をそれに追加します。 この例では、これらは4つのUIButtonボタンにすぎません。 ボタンフレームは関係ありません(layoutSubviewsメソッドで設定されます)。



ContainerViewクラスに戻り、layoutSubviewsメソッドを再定義します。



- ( void )layoutSubviews

{

[super layoutSubviews];



if (self.frame.size.width == 768)

{

UIView *view = [self viewWithTag:1001];

view.frame = CGRectMake(184, 100, 400, 150);



view = [self viewWithTag:1002];

view.frame = CGRectMake(184, 300, 400, 150);



view = [self viewWithTag:1003];

view.frame = CGRectMake(184, 500, 400, 150);



view = [self viewWithTag:1004];

view.frame = CGRectMake(184, 700, 400, 150);

}

else

{

UIView *view = [self viewWithTag:1001];

view.frame = CGRectMake(74, 100, 400, 150);



view = [self viewWithTag:1002];

view.frame = CGRectMake(550, 100, 400, 150);



view = [self viewWithTag:1003];

view.frame = CGRectMake(74, 400, 400, 150);



view = [self viewWithTag:1004];

view.frame = CGRectMake(550, 400, 400, 150);

}

}




* This source code was highlighted with Source Code Highlighter .








この例では、絶対幅との比較を使用しています。 または、ユニバーサルチェックを使用できます。



if (UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation]))



* This source code was highlighted with Source Code Highlighter .








できた デリゲートクラスでコントローラーをアクティブにするだけです。



- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

controller = [[DemoViewController alloc] initWithNibName:nil bundle:nil];

window.backgroundColor = [UIColor blueColor];

[window addSubview:controller.view];

[window makeKeyAndVisible];



return YES;

}




* This source code was highlighted with Source Code Highlighter .








そのため、向きを変更するときに複雑なインターフェイスを変更するスムーズなアニメーションが得られました。 最小限のコードで、複雑なものはありません。



All Articles