2010年5月8日土曜日

UIView addSubviewとinsertSubview

通常ベースとなるビューにサブビューを追加するには、通常addSubviewを用います。しかし、iボタンの下などに追加する必要がある場合は、inserSubviewを使います。insertSubviewの追加のパラメータには、atIndex(階層を指定),aboveSubview(当該ビューの上)、belowSubview(当該ビューの下)があるようです。

その他にビューの交換(exchangeSubviewAtIndex)などもあります。

2010年5月7日金曜日

UIDatePicker(日付ピッカー)

日付ピッカーの実装は極めて簡単で、ビューに張りつけ、コントローラ(FIle's Orner)のアウトレットに繋げるだけになります。メソッドdateでNSDate型(%@)の日付が取得できます。

2010年5月5日水曜日

画像のアニメーションの方法

画像のアニメーションを設定するには、「アニメーションブロック」を宣言するそうです。
[UIView beginAnimations:@"View Flip(任意 or nill)" context:nill];
[UIView setAnimationDuration:1.25(秒)];
[UIView setAnimationCurve: UIViewAnimationCurveEaseInOur];
//4パターンあり。UIViewを参照


[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight
forView:self.view cash:YES];


//4パターンあり。UIViewを参照


[view2object viewWillAppear:YES];
[view1object viewWillDisappaer:YES];


[view1object.view removeFromSuperview];
[self.view insertSubview: view2.view atIndex:0];


[view1object viewDidDisapper:YES];
[view2object viewDidAppear:YES];




[UIView commitAnimation]


//本ではAppearとDisapperで指定するオブジェクト逆になっていましたが、どうなんでしょう........(逆にしても何も変わらない.......)

lazy loading(遅延読み込み)

マルチビューのルートコントローラのコーディング時は、リソースを極力使用しないように、切り替え時に個別のビューのリリースと生成を行うのが一般的で、これをlazy loadingと呼ぶようです。

この実装のためには、
-(void)viewDidLaoadをオーバーライドし、
オブジェクトをnib指定(initWithNibname)で生成(alloc)し、
selfの当該オブジェクトに代入
self.viewで初期画面を表示

-(void)switchviews:(id)senderで
view1が表示対象であることを、self.view1.view.superview == nilで判定します(view1がまだ組み込まれていないため、親のビューを持たない)。YESなら、もしインスタンスが生成されていなければ生成し、View2をremoveFromSuperviewし、self.viewにinsertSubviewします(at Index:0 最下層)。
view2が表示対象ならば(else)、逆をします。

-(void)didReceiveMemoryWarningで、該当オブジェクトviewのsuperviewがnilでなければ該当viewをnilし、画面から消し、メモリも解放します。いままで-(void)viewDidUnloadでまとめてnilしていましたが、マルチビューの場合こちらで解放するようです(難しい・・・)。

Interface Builderの基本操作

いまさらですが、Interface Builderを含めた基本操作についてです。
基本として以下の操作とするようです。

1. ヘッダファイルにアクション(ビュー→コントローラ)及びアウトレット(コントローラ→ビュー)を記載する。

2. APPデリゲートのアウトレットとしてサブビューを追加した場合は、Interface Builderで当該nibにコントローラクラスを指定した上で、APPデリゲート→サブビューコントローラのnibへアウトレットを接続する。

3. Interface Builderで、該当するビューからコントローラのnibへアクションを、コントローラのnibからビューへアウトレットを接続する。

4. 実装ファイル(*.m)でインスタンスを実装する。

UIWindow


UIWindow クラスは windowsとして知られたオブジェクトであり、スクリーンに表示されるwindowsアプリケーションを管理、調整する。イベントと表示が主な機能であり、ビュー階層のルートとなる。iPhoneアプリケーションでは一つのwindowしかない。

ウィンドウを構成する

ウィンドウキーを作成する

座標を変換する

イベントを送る

@class (クラスの宣言)

@class宣言は、当該クラスの親クラス以外のクラスを宣言する際に、ヘッダを明示的にインポートしない場合に使用するそうです。

実装例では、ヘッダファイルで@class宣言を、実装ファイルで#inportをしているようです。

2010年5月4日火曜日

マルチビューアプリケーション

マルチビュー開くプリケーションは、それぞれのビューに対応したView-nib-Controllerとこれらを切り替えるルートコントローラから構成するそうです。

ルートコントローラのビューとしてToolbarと書きましたが、実際はView1,View2の親となり、これらのビューをサブビューとして読み込むようです。

2つのビューによる回転のサポート

2つのビューを使った回転時の表示サポートを勉強してみました。

表示にあたり、self.view.transformとあるのは(UIView)self.viewのプロパティで、オブジェクトのサイズ、位置、角度を変えるための構造体のようです。

CG系の機能はまだ概念すらつかめていません。

しかも、各向きをサポートすると、初期のviewアウトレットも向きに合わせて設定すべきかと思いますが、工夫して実装しないと固定のようです(Files'Ornerのviewアウトレットの指定のみではだめ)。

回転系の機能はちょっと後回しですね......

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
if(toInterfaceOrientation == UIInterfaceOrientationPortrait){
self.view =self.portrait;
self.view.transform = CGAffineTransformIdentity;
self.view.transform = CGAffineTransformMakeRotation(degreesToRadians(0));
self.view.bounds = CGRectMake(0.0, 0.0, 300.0, 480.0);
}
else if(...
        }
}

2010年5月3日月曜日

Interface Builderの照会機能

Interface Buiderのエディタは、Objective-Cやライブラリ等の機能を照会するのに便利な機能を備えます。

入力中に「ESC」キーを押すと、選択肢が表示されるため、先頭の言葉がわかるだけで選択肢から簡単に入力ができます。

また、Optionキーを押しながら該当用語をダブルクリックすると、説明用のウィンドウが表示され、さらに上の右から2番目のアイコンをクリックすると、該当リファレンスが表示されます。めちゃくちゃ便利です。

viewDidUnloadメソッドとdeallocメソッド

ビューのコントローラを構成する際のメモリ管理として、viewDidUnloadメソッドとdeallocメソッドでアウトレットでretainしたインスタンスの解放に関する実装が不可欠です。
deallocの場合、releaseですが、viewDidUnloadの場合、nilを設定するそうです。

------------- sample code ------------------

@synthesize nameField;
@synthesize numberField;
@synthesize sliderLabel;
@synthesize leftSwitch;
@synthesize rightSwitch;
@synthesize doSomethingButton;


- (void)viewDidUnload {
    self.nameField = nil;
self.numberField = nil;
self.sliderLabel = nil;
self.leftSwitch = nil;
self.rightSwitch = nil;
self.doSomethingButton = nil;
[super viewDidUnload];
}


- (void)dealloc {
[nameField release];
[numberField release];
[sliderLabel release];
[leftSwitch release];
[rightSwitch release];
[doSomethingButton release];
    [super dealloc];
}
------------------------------

UIImage(イメージクラス)

UIImageクラスは、以下の機能を持ちます。

キャッシュされたイメージをロードする処理

+ imageNamed:

新規イメージを生成する

  • + imageWithContentsOfFile:
  • + imageWithData:
  • + imageWithCGImage:
  • – stretchableImageWithLeftCapWidth:topCapHeight:
  • イメージを拡大/縮小したりサイズを変更する際にキャップとして指定されたエリアは拡大/縮小されない。このテクニックは幅を変更可能なボタンとして良く
    使用され、同じ曲率のコーナを保持し、中心が伸びる/縮めることが必要な場合に使用する。
  • leftCapWidth
  •  左端(leftCap)として指定する値。イメージを水平にのばしたくない時は 0を指定する。
  • topCapHeight
  •  上端(topCap)として指定する値。 イメージを垂直にのばしたくない時は0を指定する。
  • ReturnValue
  • 端の値を反映した新しいイメージオブジェクト
イメージを初期化する
イメージの属性

イメージを描画する

UIAleartView


アラートビューを生成する

  • – initWithTitle:message:delegate:cancelButtonTitle:otherButtonTitles:
  • ex. 
  •  UIAlertView *alert = [[UIAlertView alloc]
                         initWithTitle:@"Row Selected!"
                               message:message
                              delegate:nil
                     cancelButtonTitle:@"Yes I Did"
                     otherButtonTitles:nil];
     [alert show];
  •  [message release];
  •  [alert release]; 
プロパティを設定する
ボタンを構成する
表示する
終了する

2010年5月2日日曜日

UIActionSheetDelegate プロトコル

UIActionSheetDelegate プロトコルは、実装すべきUIActionSheet のデリゲートのメソッドを定義します。  デリゲートには、ボタンのアクションとその他のカスタマイズする振る舞いを実装します。このプロトコルに定義されるいくつかのメソッドはオプションです。
もし、固有のボタンやカスタマイズされた振る舞いを加えた場合、交換するデリゲートメッセージをハンドリングするため、このプロトコルに合うように、デリゲートを実装します。アクションシートオブジェクトのdelegate プロパティは、アプリケーションオブジェクトの一つをデリゲートとして指定します。
もし、アクションシートに固有のボタンを加えた場合、それらのボタンがクリックされたときの応答のため、デリゲートは actionSheet:clickedButtonAtIndex: メッセージを実装しなくてはなりません。もしくは、カスタマイズするボタンを無くすかです。 actionSheet:clickedButtonAtIndex: デリゲートメソッドが起動された後、アクションシートは自動的に終了します。
オプションとして、 システムがアクションシートをキャンセルした時に適切な動作をとらせるために、 actionSheetCancel: メソッドを実装することができます。もし、デリゲートがこのメソッドを実装しなかった場合、デフォルトの振る舞いはキャンセルボタンの押下をシミュレートし、ビューを閉じます。
また、“Customizing Behavior.”にあるメソッドを使用することで、アクションシートの表示と終了の振る舞いののオプションを増やすことができます。

◆アクションへ応答する

◆振る舞いをカスタマイズする
◆キャンセルする

UIViewController(ビューコントローラ クラス)

UIViewControllerクラスは、コントロールを記述するクラスの親クラスとなります。

nibファイルを使用するビューコントローラを生成する

ビューを管理する

  •   view  property
  • コントローラが管理するビューを示す。このプロパティには、ビューコントローラのview階層のルートビューを代表するビューがストアされる。 スクリーン内のどこにビューコントローラを表示させようが(モーダルビューであってもビューコントローラをベースとした一部であっても)、このビューはアプリケーションウィンドウ内で取得され表示される。 デフォルト値は nil.
  • もしこのプロパティにアクセスし、値がnil,の場合、ビューコントローラは自動的にloadView メソッドを呼び出し、結果としてviewを返す。デフォルトのloadView メソッドは、どのようなビューコントローラであっても、関連するnibファイルからviewを読み出そうと試みる。もしviewコントローラが関連するビューコントローラを持たない場合、, loadView メソッドをオーバライドし、ルートビューとサブビューを生成するために使用しなくてはならない。それぞれのビューコントローラオブジェクトは、そのビューの基本的なオーナ(soul owner)となる。複数のビューコントローラオブジェクトで同じビューオブジェクトを関連づけてはならない。
    なぜなら、このプロパティにアクセスすることにより、自動的にビューをロードし起動することができるため、もしビューがメモリ内にあると、isViewLoaded プロパティを使用することができるためである。このプロパティとは異なり、isViewLoaded プロパティは、ビューがメモリにないとビューのロードを強制できない。
    UIViewController クラスは、メモリが少ない環境でウィンドウがリリースされると、自動的にこのプロパティがnilとなる。
  • – loadView
  • – viewDidLoad
  •   コントローラのビューがメモリにロードされたあとコールされる。
  • – viewDidUnload
  • – isViewLoaded
  •   title  property
  •   contentSizeForViewInPopover  property
  •   modalInPopover  property
ビューイベントへ応答する

ビューレイアウトの振る舞いを構成する

ビューローテーションを構成する

  •   interfaceOrientation  property
  • – shouldAutorotateToInterfaceOrientation:interfaceOrientation
  • デバイスの回転時に、新しいデバイスの向きが、ビューコントローラが対応する向きであるかを2値(Boolean)で返す。
  • interfaceOrientation
  • 回転させたあとのユーザインターフェイスの向き。取り得る値は UIInterfaceOrientationに示される。
  • UIInterfaceOrientationPortrait:デバイスがポートレート(縦)モードになっており、ホームボタンが下になって立てられている状態
  • UIInterfaceOrientationPortraitUpsideDown:デバイスがポートレート(縦)モードになっているが、上下逆になっており、ホームボタンが上になって立てられている状態
  • UIInterfaceOrientationLandscapeLeft:デバイスがランドスケープ(横)モードになっており、ホームボタンが左側で立てられている状態
  • UIInterfaceOrientationLandscapeRight:デバイスがランドスケープ(横)モードになっており、ホームボタンが右側で立てられている状態
メモリ警告を取り扱う

関係するその他のビューコントローラを取得する

モーダル(一時的)ビューを表示する

ナビゲーションインタフェースを構成する

ナビゲーションコントローラのツールバーを構成する

タブバーアイテムを構成する