-
Notifications
You must be signed in to change notification settings - Fork 336
3.1 UIView
View Programming Guide for iOS | iOS Viewプログラミン グガイド
UIView クラスは大きく分けて以下の役割を持っています。
- 独自のコンテンツ描画 (画面上に表示するオブジェクトとしての役割)
- 各 View を管理するコンテナ
- アニメーション
- イベント処理 (タップやピンチインなど)
画面上に表示するもの自身としての役割と、階層構造で UIVeiwを管理している、という点をまず抑えてください。 以下では UIView の利用方法と仕組みについて説明します。
画面上にオリジナルのコンテンツを表示するまでを解説します。
UIViewの初期化は、「コード上で行う方法」と storybaord や xib のように 「Interface Builderを利用する方法」とがあります。 今までの章でstorybaord上にパーツを配置していた例がありますが、これが後者の「Interface Builderを利用する方法」にあります。
ここでは、コード上からUIViewを利用する方法を解説します。
UIView のイニシャライザ は -initWithFrame:
で、このメソッドを用いて初期化を行います。
引数として渡す frame
は CGRect型の値を渡します。CGRectは 原点(origin
) と大きさ(size
) の二つの要素を持つ構造体で、 UIViewの位置と大きさを定義して渡します。例えば以下のようにすると、原点が (10, 100), 大きさが (200, 50) のUIViewを作ることができます。
CGRect frame;
frame.origin.x = 10;
frame.origin.y = 100;
frame.size.width = 200;
frame.size.height = 50;
UIView *view = [[UIView alloc] initWithFrame:frame];
UIViewにはいくつかのプロパティがあります。詳しくはクラスリファレンス(UIView Class Reference)をごらんください。
よく利用するプロパティは例えば以下のようなものがあります。
プロパティ名 | 解説 |
---|---|
backgroundColor | Viewの背景色を表すプロパティです。デフォルトでは透明です。Viewがちゃんと表示されているのかどうかの確認をしたい場合は適当な値を入れてデバッグなどをします。 |
hidden | Viewの表示/非表示 を切り替えるパラメータです。view.hidden = YES; とするとViewが非表示になります。 |
frame, bounds | 共にViewの位置と大きさに関するプロパティです。frameは親Viewの座標系に対する位置と大きさ、boundsは自分の座標系に対する位置と大きさを返します。基本的にはframeで位置やサイズを調整するのでframeを利用するケースの方が多いです。 |
Viewを配置して画面上に表示します。iOSではViewを階層構造で管理していて、あるViewがあり、その上に重ねていく、という手順でViewを表示します。またこの際の注意点として必ず一つrootとなるviewが必要になります。
UIViewControllerを利用して画面を作ることが多いと思うのですが、UIViewControllerには一つviewが割り当てられているので、このviewに追加していきます。
viewを追加するにはaddSubView
を利用します。
何かの ViewControllerのviewDidLoad あたりで実行してください。
UIView *view = [[UIView alloc] initWithFrame... ]; // UIViewの初期化
view.backgroundColor = [UIColor blueColor]; // デフォルトでは透明なので配置されてもわからない。そこで適当な色を入れておく
[self.view addSubView:view]; // viewを追加. self.viewはUIViewControllerのプロパティ
ある viewA に重ねられた viewB は ViewA の SubView となります。viewB は viewA の subViews に管理されます。
上図のように、view に任意の UIView コンポーネントを複数個配置してください。IBOutlet を使用せずにプログラムから特定の UIView コンポーネントを消してください。
- for の高速列挙を使ってください。
- [obj isKindOfClass:[UIView class]] を使うことで obj が UIView クラスなのかを判定できます。
UIView インスタンスは NSinteger の tag というプロパティを持っています。ここに数値をセットすることで、View を高速に検索することが出来ます。
UIView *subView = [view viewWithTag:8];
このコードを実行することで view とその subView を深さ優先検索し該当 view があればそこで検索を終了します。
また、タグを使うことによって、ボタンのイベント処理を一つのメソッドにまとめることが出来ます。
このような場合、sender.tag で処理を振り分けることで、ボタンごとにメソッドを宣言実装する必要がなくなります。
今までに出てきた addSubView/removeFromSuperView の他にも view を insert するメソッドがあります。
- insertSubview:atIndex: subViews の index を指定
- insertSubview:aboveSubview: 指定の view の上に insert
- insertSubview:belowSubview: 指定の view の下に insert
- exchangeSubviewAtIndex:withSubviewAtIndex: subView の入れ替え、remove してから addSubView するよりも高速
iOS では左上を座標の起点とします。
iOS Viewプログラミン グガイド から引用
frame
viewの位置や大きさを変更する場合はframeプロパティを変更します。
view.frame = CGRectMake(10, 20, 30, 40); // 原点(10, 20)、width = 30, height = 40
注意 CGRectには値を直接アサインできません。そのため以下のようなコードはコンパイルエラーとなります。
view.frame.origin.y = 10; // コンパイルエラー!
そのため一つのプロパティのみを変更する場合は一度変数に取ってから、値を変えて再代入します。
CGRect frame = view.frame;
frame.origin.y = 10;
view.frame = frame;
View の stretch 機能を使うことで画像の引き延ばし可能領域を設定することが出来ます。
Interface Builder 上で設定する場合は Stretching の部分の数値を変更することで設定可能です。
- x, y : 起点から **引き延ばし不可能 ** な領域の割合を設定します
- Width, Height : x, y で決めた点から 引き延ばし可能 な領域を設定します。
画像リンクcircle
はじめに
-
導入
-
1.3 UIViewController1 UIViewController のカスタマイズ(xib, autoresizing)
-
UIKit 1 - container, rotate-
-
UIKit 2- UIView -
-
UIKit 3 - table view -
-
UIKit 4 - image and text -
-
ネットワーク処理
-
ローカルキャッシュと通知
-
Blocks, GCD
-
設計とデザインパターン
-
開発ツール
-
テスト
-
In-App Purchase
-
付録