UIButtonの基本

何で自分でも忘れていたのか分からないくらい大バカなミスをしたので、
自省の意味もこめて軽くUIButtonを作るときの基礎的な部分を書いておきましょう。



UIButton

UIButtonクラスは、スクリーン上にボタンを設置するための手段を提供するUIControlサブクラスです。
ボタンは、タップされるとそのタッチイベントを傍受し、対象のオブジェクトに
アクションメッセージを送信します。
ターゲットとアクションを設定するためのメソッドはUIControlクラスから継承されています。
このクラスは、ボタンのタイトル、イメージ、その他の属性のプロパティを設定する
メソッドを提供します。
setメソッドを使用することで、ボタンのそれぞれの状態に対応した異なる外観を指定することが出来ます。

説明し始めると範囲が広くなりすぎるので、
私が普段使うあたりに絞っておきます。


初歩的なものはUIButtonTypeRoundRectなんですが、大抵はCustomを使ってます。


ボタンのタイプを指定する

UIButton* button = [UIButton buttonWithType:UIButtonTypeCustom];

buttonWithTypeの引数には、以下のような指定が行えます。
デザイナーと組んで仕事を行う場合は、大抵Customになると思いますが。
http://profo.jp/wiki/index.php?UIButton#ga16b871


この初期化関数によって、UIButtonのオブジェクトを生成します。
今後は、全てこの「button」変数に対して処理を行っていきます。


allocやinitが無いと思いますが、大丈夫です。 一時変数的な扱いで初期化されています。
当然のことながらスコープの範囲を抜けると解放されてしまうため、
範囲を抜ける前に配置対象のViewに対してaddSubViewを行うようにしてください。


Viewに対してaddSubViewされたオブジェクトは、そのViewが存在している限り
解放されずに残り続けることになります。
何かしらの判定に、解放せず使い続けたい場合はメンバ変数などにretainして
突っ込んでおけばいいのではないでしょうか。



サイズを指定する

[button setFrame:CGRectMake(x, y, width, height)];

サイズといっしょにoriginの座標も指定します。
位置だけを変更する場合は、setCenterで中心座標から指定してやるしかありません。
setFrameを使って、width,heightは変更しないで原点だけ、というのも有り。



背景画像を指定する

[button setBackgroundImage:
        [UIImage imageNamed:@"hoge.png"] forState:UIControlStateNomal];

ButtonTypeをCustomにした場合、画像を貼るなり色を設定するなりしないと
ボタンとしての体裁が取れませんので、何か設定しましょう。

[button setImage:
        [UIImage imageNamed:@"hoge.png"] forState:UIControlStateNomal];

Backgroundではなく、setImageとして完全に画像を指定することも出来ます。
この場合、注意しなくてはいけないのが「setImage」のため、
後に記述する「setTitle」でラベルを指定しようとしても文字が乗らなくなります。



ラベルを指定する

[button setTitle:@"Sample" forState:UIControlStateNormal];

これを指定すると、ボタンの上に文字が乗るようになります。
ただし、上記の「setImage」を行っていると見えなくなるため、注意が必要。
画像の上に文字を乗せたい場合は、setBackgroundImageにしましょう。


ラベルの色を変える

[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];

UIColorで色を指定します。
RGBで色を指定したい場合は、[UIColor colorWithRed:green:blue:alpha:]を使いましょう。


それぞれ0.0〜1.0で値を指定するため、例えば通常のRGBのように255で指定する場合は
設定したいRGB値を255.0fで割って指定しましょう。例えば以下のように。

[UIColor colorWithRed:96/255.0f green:128/255.0f blue: 196/255.0f alpha:1.0]

ラベルのフォントを変える(文字サイズなど)

[[button titleLabel] setFont:[UIFont systemFontOfSize:14.0f]];

文字に関する操作は、UIButtonの「titleLabel」に対して行います。



イベントを設定する

[button addTarget:self action:@selector(clickButton:) forControlEvents:UIControlStateTouchUpInside];

Targetで指定したクラスにある@selectorで指定された関数を、Eventsが発生したときに行います。
この場合は、ボタンが領域内で押されたときにclickButton関数を実行します。


最近知りましたが、この「@selector(xxx)」は、一時的に「SEL型」として保存できます。
そのため、以下のように置き換えることも可能です。

SEL sel = @selector(clickButton:);
[button addTarget:self action:sel forControlEvents:UIControlStateTouchUpInside];

これを知っていると、かなり複数ボタンを作成する際などの関数化が楽になりますね。



気が向いたらいくらか追加するかも知れませんが、多分しません。