ドット演算子を使用する場合、明示的に型を指定しないと(id型の場合)、ドット演算子が使えないそうです。そのため、id型で取得するsenderの利用は、特定の型のインスタンスに代入してからドット演算子を使うことになるようです。
-(IBAction)sliderChange:(id)sender{
UISlider `slider =(UISlider *)sender;
int a = (int)(slider.value +0.5f);
}
でも、これじゃだめなんでしょうか?
-(IBAction)sliderCahnge:(UISlider*)sender{
int a = (int) (sender.value +0.5f);
}
実行してみるとできました。たぶんいいのでしょう。こちらのほうが明示的かつ簡潔的で好みです。
2010年5月1日土曜日
UIResponder(イベントの管理応答)
UIVeiwクラスやその派生クラスは、UIResponderを継承しており、以下の機能も保有しています。
レスポンダーチェーンを管理する
resignFirstResponderでは、当該オブジェクトをFirstResponder(ユーザ使用中)から解除することで、キーボードを非表示にできます。
resignFirstResponderでは、当該オブジェクトをFirstResponder(ユーザ使用中)から解除することで、キーボードを非表示にできます。
- – nextResponder
- – isFirstResponder
- – canBecomeFirstResponder
- – becomeFirstResponder
- – canResignFirstResponder
- – resignFirstResponder
入力ビューを管理する
- inputView property
- inputAccessoryView property
- – reloadInputViews
タッチイベントに応答する
- – touchesBegan:withEvent:
- – touchesMoved:withEvent:
- – touchesEnded:withEvent:
- – touchesCancelled:withEvent:
モーションイベントに応答する
- – motionBegan:withEvent:
- – motionEnded:withEvent:
- – motionCancelled:withEvent:
アンドゥを取得する
- undoManager property
コマンドを有効にする
- – canPerformAction:withSender:
ビューのベースクラスは何が良いか
ビューを構成する際のベースとなるクラスは、View-based Applicationをひな形とした場合、UIViewクラスとなります。
しかしながら、UIViewクラスはタッチイベントをハンドリングすることができません。
そこで、ベースとなるクラスをUIViewクラスを継承したUIControlクラスとすると、部品以外の部分でもタッチイベントを持つことができ、そのイベントをもとにコントロールすることができます。
よく、キーボードを消したいのに消せないアプリがありますが、それはUIControlクラスをベースとしていないか、テキストフィールド以外をTouchUpしたとき、キーボードを消すためにテキストフィールドクラスををFirstResponderからはずす(resignする)resignFirstResponderメソッドを構成し、アクションとして呼び出していないためのようです。
しかしながら、UIViewクラスはタッチイベントをハンドリングすることができません。
そこで、ベースとなるクラスをUIViewクラスを継承したUIControlクラスとすると、部品以外の部分でもタッチイベントを持つことができ、そのイベントをもとにコントロールすることができます。
よく、キーボードを消したいのに消せないアプリがありますが、それはUIControlクラスをベースとしていないか、テキストフィールド以外をTouchUpしたとき、キーボードを消すためにテキストフィールドクラスををFirstResponderからはずす(resignする)resignFirstResponderメソッドを構成し、アクションとして呼び出していないためのようです。
- (IBAction) backgroundTap:(id)Tap{
[Name resignFirstResponder];
[Number resignFirstResponder];
以下では、デフォルトで「View」となっているnibのインスタンスが、「Control」となり、「Control」のTouch Dounイベントが、File's Ownerのアクションと接続されているのがわかるかと思います。要注意ですね。
2010年4月30日金曜日
UIControllEvent(Button)
UIControlクラス及びその派生クラスでは、ボタン等が押されたときのアクションとしてEventが定義(UIControlEvent定数)があります。ベースとなるクラスがUIControl(及びその派生クラス)の場合、これを(IBAction)で示したメソッドと結びつけることでトリガーとして受け取ることができるようです。
UIControlEventTouchDown
コントロール内でタッチした瞬間(touch-down)をイベントとして取得する
UIControlEventTouchDownRepeat
コントロール内でタッチを繰り返した場合: UITouch tapCount 目そっとで回数を指定する。
UIControlEventTouchDragInside
コントロール内でドラッグされた場合のイベント
UIControlEventTouchDragOutside
コントロール外でドラッグされた場合のイベント
UIControlEventTouchDragEnter
コントロールの外から中へドラッグされた場合のイベント
UIControlEventTouchDragExit
コントロルの中から外へドラッグされた場合のイベント
UIControlEventTouchUpInside
コントロール内でタッチアップした場合のイベント
UIControlEventTouchUpOutside
コントロール外でタッチアップした場合のイベント
UIControlEventTouchCancel
現在のタッチをキャンセルするシステムイベント
UIControlEventValueChanged
異なる種類の値を出力するため、ドラッグやその他のコントロールの操作
UIControlEventEditingDidBegin
UITextField オブジェクトに入るため、編集セッションを初期化するタッチ
UIControlEventEditingChanged
UITextFieldオブジェクト内の編集を変更するタッチ
UIControlEventEditingDidEnd
UITextField のオブジェクトを離れるために、編集セッションを終了するタッチ
UIControlEventEditingDidEndOnExit
UITextField オブジェクトの編集セッションを終了するタッチ
UIControlEventAllTouchEvents
全てのタッチイベント
UIControlEventAllEditingEvents
UITextField オブジェクトのための編集タッチの全て
UIControlEventApplicationReserved
アプリケーションが使用が可能なコントロールイベントの値の範囲
UIControlEventSystemReserved
インターナショナルフレームワークで使用のための予約されたコントロールイベントの値の範囲
UIControlEventAllEvents
システムイベントを含む全てのイベント
MainWindow.xib(nibファイル)
Interface Buiderのすごいところは、はじめに起動するインスタンスの生成をを開発者が意識せずに開発可能なところだそうです。通常の開発ツールは、ユーザインターフェイスのデザインにとどまるようですが、このnibファイルをもとにインスタンスを生成し、その相互関係までもGUIで定義する、ということのようです。Appleはえらい!!
ちなみに、nibファイルの中身は以下のものとなるようです。
・File's Owner 起動時にnibファイルを読み込むオブジェクト
・First Responder ユーザが現在操作(インタラクト)しているオブジェクト
・その他 プログラムで使用するインスタンス(この場合、AppDelegate,View ControllerとWindow(1つ)となる)
UIApplicationDelegateプロトコル
プログラムの終了等にファイルの保存等の処理が必要なアプリケーションの基本動作をこのデリゲートに実装します。
〜AppDelegate.h, 〜AppDelegate.mに実装します。
必要時に以下のような機能を実装します。
〜AppDelegate.h, 〜AppDelegate.mに実装します。
必要時に以下のような機能を実装します。
アプリケーションの振る舞いの制御
– applicationDidFinishLaunching:
– application:didFinishLaunchingWithOptions:
– applicationWillTerminate:
– applicationDidReceiveMemoryWarning:
– applicationSignificantTimeChange:
URLリソースを開く
ステータスバーの初期設定
アクティブ状態での変更応答
アプリケーションの表示の管理
リモート通知のハンドリング
– application:didReceiveRemoteNotification:
– application:didRegisterForRemoteNotificationsWithDeviceToken:
– application:didFailToRegisterForRemoteNotificationsWithError:
アウトレットをリリースする。
アウトレット生成時に、アウトレットを保持するようコードを書くことになりましたが、
@property (nonatomic, retain) IBOutlet Objecttype *Object;
そのため、実行後のdealloc時に、当該オブジェクトを解放する必要があるようです。
-(void) dealloc {
[Object release];
[super dealloc];
}
@property (nonatomic, retain) IBOutlet Objecttype *Object;
そのため、実行後のdealloc時に、当該オブジェクトを解放する必要があるようです。
-(void) dealloc {
[Object release];
[super dealloc];
}
押されたボタンを識別する。
押されたボタンを識別する方法としては、ボタンのタイトル(Title)を確認する方法があります。
また、ボタンのタグ(Tag)を使う方法があります。
タイトルの場合言語に依存しますが、Tagを使う場合は言語に依存せず識別することができます。
以下はTitleの場合です。
@interface ViewController : UIViewController
-(IBAction) buttonPressed:(id)button
@end
@imprementation ViewController
-(IBAction) buttonPressed:(id)button{
NSSting *button_name = [ button titleForState:UIControlStateNormal];
// *button_nameにボタンのタイトルが入っているのでこれで識別する。
}
また、ボタンのタグ(Tag)を使う方法があります。
タイトルの場合言語に依存しますが、Tagを使う場合は言語に依存せず識別することができます。
以下はTitleの場合です。
@interface ViewController : UIViewController
-(IBAction) buttonPressed:(id)button
@end
@imprementation ViewController
-(IBAction) buttonPressed:(id)button{
NSSting *button_name = [ button titleForState:UIControlStateNormal];
// *button_nameにボタンのタイトルが入っているのでこれで識別する。
}
UIButton (ボタンクラス概要)
UIButton機能区分とメソッドには以下があります。
+ buttonWithType:
ボタンのタイトル設定
buttonType
propertyfont
propertylineBreakMode
propertytitleShadowOffset
propertytitleLabel
propertyreversesTitleShadowWhenHighlighted
property– setTitle:forState:
– setTitleColor:forState:
– setTitleShadowColor:forState:
– titleColorForState:
– titleForState:
– titleShadowColorForState:
ボタンのイメージ設定
adjustsImageWhenHighlighted
propertyadjustsImageWhenDisabled
propertyshowsTouchWhenHighlighted
property– backgroundImageForState:
– imageForState:
– setBackgroundImage:forState:
指定されたボタンstateで使用するバックグラウンドイメージをセットする。
Parameters
image
指定されたstateで使用するためのバックグラウンドイメージ
state
指定されたイメージを使用する状態(state)。
UIControlStateで値が宣言される。
一般に、もしプロパティで状態が指定されていない場合
UIControlStateNormal
が値として使用される。そしてプロパティはシステムのデフォルト値となる。そのため最低限Normal stateの値はセットする必要があある。
– setImage:forState:
ボタンの余白設定
現在の状態の取得
ボタンの余白設定
contentEdgeInsets
property titleEdgeInsets
property imageEdgeInsets
property現在の状態の取得
currentTitle
property currentTitleColor
property currentTitleShadowColor
property currentImage
property currentBackgroundImage
property imageView
propertyボタンの寸法の取得
– backgroundRectForBounds:
– contentRectForBounds:
– titleRectForContentRect:
– imageRectForContentRect:
UIControlStateNormal
通常のデフォルトのコントロール状態。使用可能な状態ですが、選択/ハイライトはされていない。
UIControlStateHighlighted
ハイライトされた状態。コントロールは、タッチ入力時とタッチ状態から出た時、トラッキング状態から出た時、タッチアップされた時にこの状態に入る。highlighted プロパティを通じ、この値を取得し、セットすることができる。
UIControlStateDisabled
コントロール状態を無効にする。 現在コントロールが利用不可となっていることを示す。enabled プロパティを通じ、この値を取得し、セットすることができる。
UIControlStateSelected
コントロール状態を選択する。 多くのコントロールではこの状態は振る舞いや見え方を変更しないが、UISwitchControl等のサブクラスに影響を及ぼす。selectedプロパティを通じ、この値を取得し、セットすることができる。
UIControlStateApplication
アプリケーションが使用することができる追加のコントロール状態のフラグ
UIControlStateReserved
内部のフレームワークが使用するための予約されたコントロール状態のフラグ
----------------- sample code -----------------
-(void)viewDidLoad{
UIImage *buttonImageNormal = [UIImage imageNamed:@"whiteButton.png"];
UIImage *stretchableButtonImageNormal = [buttonImageNormal
strectchableImageWithLeftCapWidth:12 topCapHeitht:0];
[doSomethingButton setBackgroundImage:stretchableButtonImageNormal forState:UIControlStateNormal];
UIImage *buttonImagePressed = [UIImage imageNamed:@"blueButton.png"];
UIImage *stretchableButtonImagePressed = [buttonImagePressed stretchableImageWithLeftCapWidth:12 topCapHeight:0];
[doSomethingButton setBackgroundImage:strectchableImagePressed forState:UIControlStateHighlighted];
}
---------------------------------
登録:
投稿 (Atom)