連載の最後にデモアプリとして簡易カタログアプリを作ります。画像表示とスクロールやピンチ操作に対応するところまで実装しましょう。最初にアプリの構造と画像データの扱いと表示方法を説明します。アプリは前回も使ったMaster-Detailテンプレートをもとに作成します。画像ファイルを読み込む「UIImage」クラスと画像を表示する「UIImageView」クラスを使い、画像をファイルから読み込み表示する方法を解説します。

iOSアプリの構造と制限

 アプリの構造を理解しなければプログラミングはできません、ここでは構造の概要を説明します。iOSのアプリは基本的にOS Xのアプリと同じくバンドルと呼ばれるディレクトリ構造を持っています。iOSは基本的にUNIXでアプリケーションがアクセス可能なファイルは決まっています。アクセス可能な範囲はサンドボックスと呼ばれています。

バンドル

 バンドルはテキストや画像などのリソースを1つに集めたディレクトリでiOSとMacで共通です。アプリはアプリケーションバンドル内に実行可能ファイルやアイコンデータ、画像データ、ローカライズ別のテキストなどを含みます。アプリのインストールはデバイスにアプリケーションバンドルを再現し実行可能にすることです。ちなみにXcodeのプロジェクトファイルもバンドルになっています。そして第2回でも示しましたがXcodeもアプリケーションバンドルです。

サンドボックス

 iOSではシステムと他のアプリを保護するため、アプリがアクセスできるファイルはサンドボックス内に限られています。そしてサンドボックス内のディレクトリには役割があります。

 例えば「<Application_Home>/Documents」ディレクトリは自動バックアップされます、このため外部から再ダウンロード可能なファイルは「Documents」ではなくバックアップされない「<Application_Home>/tmp」または「<Application_Home>/Library/Caches」に保存すべきとされています。

 アプリケーションバンドル内の画像やテキストファイルはコード署名されているため変更できません。変更する場合はファイルをサンドボックス内にコピーして、コピーした方を変更して保存します。

View階層

 Cocoa touchでは「UIView」クラスが画面表示とタッチ操作などのイベント処理を行います。UIViewは階層構造にできます。文字表示なら「UITextView」クラスや「UILabel」クラス、画像なら「UIImageView」クラス、HTML表示なら「UIWebView」クラスなどを適切に配置し利用するのが基本です。UIViewを継承しカスタム表示することも可能です。スクロールが必要な場合は「UIScrollView」クラスを使います。

 UIViewのインスタンスaを親として別のUIViewインスタンスbを重ねた場合、bはaのサブビュー、aはbのスーパービューと呼びます。サブビューはいくつでも追加でき、サブビューがさらにサブビューを持つことができます。サブビューは通常、スーパービューの範囲内に配置しますがはみ出すことも可能です(写真1)。

写真1●Xcode 6では実行時に Debug>View Debugging>Capture View HierarchyメニューでView階層を可視化できる。クリックすると階層を表示します
写真1●Xcode 6では実行時に Debug>View Debugging>Capture View HierarchyメニューでView階層を可視化できる。クリックすると階層を表示します
[画像のクリックで拡大表示]