『はじめてのiPhoneプログラミング』まとめ

2012. 03. 15
はじめてのiPhoneプログラミング』(iOS 3.x版は『はじめてのiPhone3プログラミング』)に関する記事を下表にまとめます。

第1章 ジャングルへようこそ『はじめてのiPhoneプログラミング』を始めてみた
第2章 ティキ神さまを怒らせるなHello World
第3章 基本的なインタラクションを
処理する
Button Fun
第4章 ユーザーインターフェースを
楽しくしよう
Control Fun(1)~Image ViewとText Field
Control Fun(2)~SliderとLabel
Control Fun(3)~SwitchとSegmented Control
Control Fun(4)~Action SheetとAlert
Control Fun(5)~Sample Code
第5章 オートローテーションと
オートサイジング
Autosize(1)~Autosizing
Autosize(2)~コードによる変更
Swap~ビューの切り替え
第6章 マルチビュー
アプリケーション
View Switcher(1)~下準備
View Switcher(2)~SwitchViewController
View Switcher(3)~コンテントビューの実装
View Switcher(4)~トランジションのアニメ化
View Switcher(5)~リファクタリング
第7章 タブバーとピッカーPickers(1)~下準備
Pickers(2)~TabBarController
Pickers(3)~DatePicker
Pickers(4)~SingleComponentPicker
Pickers(5)~DoubleComponentPicker
Pickers(6)~DependentComponentPicker(1)
Pickers(7)~DependentComponentPicker(2)
Pickers(8)~CustomPicker(1)
Pickers(9)~CustomPicker(2)
Pickers(10)~サンプルコードとの差異
第8章 テーブルビューの導入Simple Table(1)~テキストの表示
Simple Table(2)~画像の追加
Simple Table(3)~デリゲートによる処理
Simple Table(4)~フォントと行高の変更
Simple Table(5)~サンプルコードとの差異
Cells(1)~サブビューによるカスタマイズ
Cells(2)~ラベルの背景色
Cells(3)~サブクラスによるカスタマイズ
Cells(4)~nibファイルからの読み込み
Sections(1)~セクションとインデックス
Sections(2)~カテゴリ
Sections(3)~検索バーの追加(1)
Sections(4)~検索バーの追加(2)
Sections(5)~サンプルコードとの差異
第9章 ナビゲーション
コントローラとテーブルビュー
Nav(1)~概要とルートコントローラ
Nav(2)~抽象クラス
Nav(3)~ルートビューコントローラ
Nav(4)~Disclosure Buttons(1)
Nav(5)~Disclosure Buttons(2)
Nav(6)~Disclosure Buttons(3)
Nav(7)~Check One
Nav(8)~Row Controls(1)
Nav(9)~Row Controls(2)
Nav(10)~Move Me(1)
Nav(11)~Move Me(2)
Nav(12)~Move Me(3)
Nav(13)~Delete Me(1)
Nav(14)~Delete Me(2)
Nav(15)~Delete Me(3)
Nav(16)~Detail Edit(1)
Nav(17)~Detail Edit(2)
Nav(18)~Detail Edit(3)
Nav(19)~Detail Edit(4)
Nav(20)~Detail Edit(5)
Nav(21)~Detail Edit(6)
Nav(22)~Detail Edit(7)
第10章 アプリケーション設定と
ユーザーデフォルト
AppSettings(1)~概要
AppSettings(2)~プロジェクトの作成
AppSettings(3)~Settings.bundle(1)
AppSettings(4)~Settings.bundle(2)
AppSettings(5)~Settings.bundle(3)
AppSettings(6)~MainViewController(1)
AppSettings(7)~MainViewController(2)
AppSettings(8)~MainViewController(3)
AppSettings(9)~FlipsideViewController
AppSettings(10)~UIViewControllerの状態通知
第11章 データの保存Persistence(1)~アプリケーションのディレクトリ構成
Persistence(2)~ディレクトリパスの入手
Persistence(3)~プロパティリストへの保存(1)
Persistence(4)~プロパティリストへの保存(2)
Persistence(5)~アーカイブへの保存(1)
Persistence(6)~アーカイブへの保存(2)
Persistence(7)~SQLite3への保存(1)
Persistence(8)~SQLite3への保存(2)
Persistence(9)~SQLite3への保存(3)
Persistence(10)~SQLite3への保存(4)
Persistence(11)~SQLite3への保存(5)
Persistence(12)~SQLite3への保存(6)
Persistence(13)~SQLite3への保存(7)
Persistence(14)~Core Dataでの保存(1)
Persistence(15)~Core Dataでの保存(2)
Persistence(16)~Core Dataでの保存(3)
Persistence(17)~Core Dataでの保存(4)
Persistence(18)~Core Dataでの保存(5)
第12章 QuartzとOpenGLで絵を
描く
QuartzFun(1)
QuartzFun(2)~ビューコントローラの編集
QuartzFun(3)~nibファイルの編集
QuartzFun(4)~ビューの編集(1)
QuartzFun(5)~ビューの編集(2)
QuartzFun(6)~タッチイベントの編集
QuartzFun(7)~サンプルコードとの差異
GLFun(1)~iOSでのOpenGL ESの利用
GLFun(2)~QuartzFunとGLFunの違い
GLFun(3)~QuartzFunとの共通部分の実装
GLFun(4)~OpenGL ESへの対応と作業工程
GLFun(5)~OpenGLES2DViewクラス(1)
GLFun(6)~OpenGLES2DViewクラス(2)
GLFun(7)~OpenGLES2DViewクラス(3)
GLFun(8)~OpenGLES2DViewクラス(4)
GLFun(9)~OpenGLES2DViewクラス(5)
GLFun(10)~GLFunViewクラス(1)
GLFun(11)~GLFunViewクラス(2)
GLFun(12)~Texture2Dクラス(1)
GLFun(13)~Texture2Dクラス(2)
GLFun(14)~Texture2Dクラス(3)
GLFun(15)~Texture2Dクラス(4)
GLFun(16)~Texture2Dクラス(5)
GLFun(17)~Texture2Dクラス(6)
GLFun(18)~Texture2Dクラス(7)
GLFun(19)~Texture2Dクラス(8)
GLFun(20)~Texture2Dクラス(9)
GLFun(21)~Texture2Dクラス(10)
GLFun(22)~Texture2Dクラス(11)
GLFun(23)~Texture2Dクラス(12)
GLFun(24)~GLFunViewクラス(3)
GLFun(25)~サンプルコードとの差異
OpenGL ESテンプレート(1)~GLFunAppDelegateクラス
OpenGL ESテンプレート(2)~GLFunViewControllerクラス(1)
OpenGL ESテンプレート(3)~GLFunViewControllerクラス(2)
OpenGL ESテンプレート(4)~GLFunViewControllerクラス(3)
OpenGL ESテンプレート(5)~GLFunViewControllerクラス(4)
OpenGL ESテンプレート(6)~GLFunViewControllerクラス(5)
OpenGL ESテンプレート(7)~GLFunViewControllerクラス(6)
OpenGL ESテンプレート(8)~GLFunViewControllerクラス(7)
OpenGL ESテンプレート(9)~GLFunViewControllerクラス(8)
OpenGL ESテンプレート(10)~GLFunViewControllerクラス(9)
OpenGL ESテンプレート(11)~シェーダプログラム
OpenGL ESテンプレート(12)~EAGLViewクラス
OpenGL ESテンプレート(13)~処理フロー
GLFun(26)~OpenGL ESテンプレートの利用(1)
GLFun(27)~OpenGL ESテンプレートの利用(2)
GLFun(28)~OpenGL ESテンプレートの利用(3)
GLFun(29)~OpenGL ESテンプレートの利用(4)
GLFun(30)~OpenGL ESテンプレートの利用(5)
GLFun(31)~OpenGL ESテンプレートの利用(6)
GLFun(32)~OpenGL ESテンプレートの利用(7)
第13章 タップ、タッチ、
ジェスチャ
TouchExplorer
Swipes(1)~イベント処理メソッド
Swipes(2)~Gesture Recognizer
Swipes(3)~マルチプルスワイプ(イベント処理メソッド)
Swipes(4)~マルチプルスワイプ(Gesture Recognizer)
TapTaps(1)~イベント処理メソッド(1)
TapTaps(2)~イベント処理メソッド(2)
TapTaps(3)~Gesture Recognizer
PinchMe(1)~イベント処理メソッド
PinchMe(2)~Gesture Recognizer
CheckPlease(1)~イベント処理メソッド
CheckPlease(2)~Gesture Recognizer
第14章 ここはどこ? 
Core Locationで行くべき道を探す
(未定)
第15章 やってしまった!(未定)
第16章 iPhoneのカメラとフォト
ライブラリ
(未定)
第17章 アプリケーションの
ローカリゼーション
LocalizeMe(1)
LocalizeMe(2)
LocalizeMe(3)
第18章 次にすることは?-


●総評

Objective-Cをある程度知っていることが前提となっていますが『iPhone SDKの教科書』などで勉強していれば素直に入れる内容です。

翻訳本なので和訳に疑問符が付く部分がありますが、コードを見たり実際に動かしてみれば理解できると思います。

日本語版はiOS 3.x版止まりですが原著はiOS 4.x版があり、サンプルコードを利用して勉強することもできます。

前半はかなり丁寧に解説されているものの、『第12章 QuartzとOpenGLで絵を描く』におけるOpenGL ES関連など、本書では解説がばっさり端折られて困る部分もありますが、良書と言って差し支えなくお勧めできます。

ただ若干内容が古くなりつつあるので最新のXcode 4とiOS 5で開発する場合には各自補正してください。



参考文献

はじめてのiPhone3プログラミングはじめてのiPhone3プログラミング
(2009/12/17)
Dave Mark、Jeff LaMarche 他

商品詳細を見る

Beginning Ios 6 Development: Exploring the Ios SdkBeginning Ios 6 Development: Exploring the Ios Sdk
(2012/12/26)
David Mark、Jack Nutting 他

商品詳細を見る

iPhone SDKの教科書―Cocoa Touchプログラミング、最初の一歩iPhone SDKの教科書―Cocoa Touchプログラミング、最初の一歩
(2009/03/18)
赤松 正行

商品詳細を見る

LocalizeMe(3)

2012. 03. 14
●文字列ファイルによるローカライズ

続いてビューの右側にある、ソースファイルLocalizeMeViewController.m内で文字列を設定しているラベルのローカライズを行います。
(ちなみにiOS 4.x版のサンプルコードでは、このローカライズは省略されています)

ソースコード内でNSLocalizedStringメソッドで設定している文字列は、Localizable.strings文字列ファイルでローカライズするのですが、今回はプロジェクト内にあるObjective-Cのソースファイル(~.m)を検索してNSLocalizedStringメソッドを抽出し、自動でLocalizable.strings文字列ファイルを生成します。

最初にアプリケーション『ターミナル』を起動します。

7938

7939

次にcd(change directory)コマンドでLocalizeMeプロジェクトフォルダに移動します。

ターミナルで『cd』の後にスペースを入れ、FinderのLocalizeMeフォルダをターミナルにドラッグ&ドロップし、returnキーを押します。

7940

これでLocalizeMeフォルダに移動したことになり、以降のコマンドの対象がLocalizeMeプロジェクト内になります。

ターミナルで『genstrings ./Classes/*.m』とコマンドを入力し、returnキーで実行します。

7941

ほどなくコマンドプロンプトが返り、LocalizeMeフォルダ下にLocalizable.strings文字列ファイルが生成されます。

7942

Localizable.stringsはUTF-16でエンコーディングされているため、プロジェクトに追加する際にデフォルトでエンコーディングがUTF-8の場合はUTF-16に変更する必要があります。
(でないと文字化けを起こします)

Localizable.strings文字列ファイルは下記のように出力されます。

/* The number 5 */
"Five" = "Five";

/* The number 4 */

"Four" = "Four";

/* The number 1 */

"One" = "One";

/* The number 3 */

"Three" = "Three";

/* The number 2 */

"Two" = "Two";

7944

ローカライズする文字列のアルファベット順にソートされていますが、LocalizeMeViewController.mソースファイル内のNSLocalizedStringメソッドから抽出されていることが分かります。

label1.text = NSLocalizedString(@"One", @"The number 1");
label2.text = NSLocalizedString(@"Two", @"The number 2");
label3.text = NSLocalizedString(@"Three", @"The number 3");
label4.text = NSLocalizedString(@"Four", @"The number 4");
label5.text = NSLocalizedString(@"Five", @"The number 5");

第二引数はローカライズする文字列に対するコメント文なので、不要ならnilとすることもできます。

第一引数がローカライズされる文字列で、左辺がソースコードに記述されている文字列であり、右辺に各ローカリゼーションで置換する文字列を設定します。

では、nibファイルなどと同様にLocalizable.stringsファイルをenとfrにローカライズします。

そしてLocalizable.strings下のfrを選択し、nibファイルの時と同様に、5つのラベルの文字列(One、Two、Three、Four、Five)をフランス語(Un、Deux、Trois、Quatre、Cinq)に変更します。

7945

実行結果は下図の様になります。

7946


●アプリケーションのタイトルのローカライズ

最後に初版やiOS 3.x版のサンプルコードにはありませんが、iOS 4.x版のサンプルコードで行われているアプリケーションのタイトルのローカライズを行います。

アプリケーションのタイトルのローカライズは、文字列ファイルInfoPlist.stringsを生成し、CFBundleDisplayNameで設定することができます。
(詳細は『Sun Limited Mt./[iPhone] アプリ名をローカライズする方法』や『Information Property List Key Reference』の『CFBundleDisplayName(p.21)』を参照してください)

まずXcodeの『グループとファイル』ペインでResourcesを選択し、右クリックで『追加』→『新規ファイル...』を選択します。

7948

『Mac OS X』ペインの『Resource』にある『Strings File』を選択して『次へ』ボタンをクリックし、ファイル名を『InfoPlist.strings』として生成します。
(文字列ファイルLocalizable.stringsファイルもこの操作で生成できますが、先にソースファイルでNSLocalizedStringメソッドによって設定している場合、抽出漏れなどを防ぐため、自動生成した方が安全かと思われます)

そしてnibファイルなどと同様に、InfoPlist.stringsファイルをenとfrにローカライズし、以下のようにそれぞれにアプリケーションのタイトル(バンドル表示名)CFBundleDisplayNameを設定します。

en)

CFBundleDisplayName = "Localize Me";

fr)

CFBundleDisplayName = "Localisez Moi";

実行結果は下図のようになります。

en)

7949

fr)

7950



参考文献

iOSアプリケーションプログラミングガイド

Information Property List Key Reference

Sun Limited Mt./[iPhone] アプリ名をローカライズする方法

はじめてのiPhone3プログラミングはじめてのiPhone3プログラミング
(2009/12/17)
Dave Mark、Jeff LaMarche 他

商品詳細を見る

Beginning Ios 6 Development: Exploring the Ios SdkBeginning Ios 6 Development: Exploring the Ios Sdk
(2012/12/26)
David Mark、Jack Nutting 他

商品詳細を見る

LocalizeMe(2)

2012. 03. 13
3)viewDidLoadメソッド

viewDidLoadメソッドでは、現在設定されている言語環境を取得してラベルに表示すると共に、ローカライズ文字列によるラベルの表示を行っています。

最初にcurrentLocaleメソッドで、現在の言語環境設定をキャッシュしたオブジェクトlocaleを取得します。

そしてdisplayNameForKey:value:メソッドで言語設定を文字列として出力します。

第一引数keyはどのような種類の値を取得するかを示すキーで、ここではロケール識別子のキーNSLocaleIdentifierを指定しています。

第二引数valueは値の取得対象となるオブジェクトで、ここではlocaleIdentifierメソッドで現在のロケール識別子を指定しています。

分かり易く言うと、
・レシーバ:出力される文字列の表記言語
・key:出力する内容(ロケール識別子の場合は『言語+地域』)
・value:出力する対象となるオブジェクト
となり、『現在設定されている言語環境』を『その言語』で文字列としているということになります。

生成した文字列は、ラベルlocaleLabelにtextプロパティで設定し表示します。

ローカライズ文字列はNSLocalizedStringメソッドで設定します。

第一引数はローカライズする文字列、第二引数は後述するローカライズ用文字列ファイルにおけるコメントが指定されています。

currentLocale

+ (id)currentLocale

現在のユーザのために論理ロケールを返します。

ロケールは、システム環境設定でユーザが指定した任意のカスタム設定の上書きを含めた、現在のユーザが選択したシステムロケールの設定によって形成されています。

このメソッドは保持されたキャッシュオブジェクトを返します。

このロケールから取得した設定は、貴方の操作に一貫性を持たせるため、システム環境設定が変更されても変更されません。

通常は返されたオブジェクトでいくつかの操作を実行してから処理を行います。

また、返されたオブジェクトがキャッシュされている可能性があるので、無期限に保持する必要はありません。

autoupdatingCurrentLocaleの対象となっています。

displayNameForKey:value:

- (NSString *)displayNameForKey:(id)key value:(id)value

指定された値の表示名を返します。

全てのロケールのプロパティキーが表示名の値での値を持っているわけではありません。

下記の例で示すように、他のロケールの言語にあるロケールの名前の取得にNSLocaleIdentifierキーを使用することができます。

最初はfr_FRロケールを使用します。

NSLocale *frLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"fr_FR"] autorelease];
NSString *displayNameString = [frLocale displayNameForKey:NSLocaleIdentifier value:@"fr_FR"];
NSLog(@"displayNameString fr_FR: %@", displayNameString);
displayNameString = [frLocale displayNameForKey:NSLocaleIdentifier value:@"en_US"];
NSLog(@"displayNameString en_US: %@", displayNameString);

返される値は次のようになります。

displayNameString fr_FR: francais (France)
displayNameString en_US: anglais (Etats-Unis)

次にen_GB localeロケールを使用した例を示します。

NSLocale *gbLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"] autorelease];
displayNameString = [gbLocale displayNameForKey:NSLocaleIdentifier value:@"fr_FR"];
NSLog(@"displayNameString fr_FR: %@", displayNameString);
displayNameString = [gbLocale displayNameForKey:NSLocaleIdentifier value:@"en_US"];
NSLog(@"displayNameString en_US: %@", displayNameString);

返される値は次のようになります。

displayNameString fr_FR: French (France)
displayNameString en_US: English (United States)

key:ロケールのプロパティキーの値を指定します。(『定数』参照)

value:キーの値を指定します。

NSLocale Component Keys

以下の定数はobjectForKey:でロケールの要素の取得に使用するキーを指定します。

NSString * const NSLocaleIdentifier;
NSString * const NSLocaleLanguageCode;
NSString * const NSLocaleCountryCode;
NSString * const NSLocaleScriptCode;
NSString * const NSLocaleVariantCode;
NSString * const NSLocaleExemplarCharacterSet;
NSString * const NSLocaleCalendar;
NSString * const NSLocaleCollationIdentifier;
NSString * const NSLocaleUsesMetricSystem;
NSString * const NSLocaleMeasurementSystem;
NSString * const NSLocaleDecimalSeparator;
NSString * const NSLocaleGroupingSeparator;
NSString * const NSLocaleCurrencySymbol;
NSString * const NSLocaleCurrencyCode;
NSString * const NSLocaleCollatorIdentifier;
NSString * const NSLocaleQuotationBeginDelimiterKey;
NSString * const NSLocaleQuotationEndDelimiterKey;
NSString * const NSLocaleAlternateQuotationBeginDelimiterKey;
NSString * const NSLocaleAlternateQuotationEndDelimiterKey;

NSLocaleIdentifier
ロケール識別子のキーです。
対応する値はNSStringオブジェクトです。
値の例:『es_ES_PREEURO』

NSLocaleLanguageCode
ロケールの言語コードのキーです。
対応する値はNSStringオブジェクトです。
値の例:『es』

NSLocaleCountryCode
ロケールの国コードのキーです。
対応する値はNSStringオブジェクトです。
値の例:『ES』

NSLocaleScriptCode
ロケールのスクリプトコードのキーです。
対応する値はNSStringオブジェクトです。

NSLocaleVariantCode
ロケールの別コードのキーです。
対応する値はNSStringオブジェクトです。
値の例:『PREEURO』

NSLocaleExemplarCharacterSet
ロケールに設定された見本文字セットのキーです。
対応する値はNSCharacterSetオブジェクトです。

NSLocaleCalendar
ロケールに関連付けられたカレンダーのキーです。
対応する値はNSCalendarオブジェクトです。

NSLocaleCollationIdentifier
ロケールに関連付けられた照合用のキーです。
対応する値はNSStringオブジェクトです。

NSLocaleUsesMetricSystem
ロケールがメートル法を使用するかどうかを示すフラグのキーです。
対応する値はブール型のNSNumberオブジェクトです。
値がNOの場合、通常はアメリカの測定単位(例えば法定マイルなど)を用いることができます。

NSLocaleMeasurementSystem
ロケールに関連付けられた測定システムのキーです。
対応する値は『Metric』や『U.S.』などのロケールによって使用される測定システムの説明を含むNSStringオブジェクトです。

NSLocaleDecimalSeparator
ロケールに関連付けられた小数点文字のキーです。
対応する値はNSStringオブジェクトです。

NSLocaleGroupingSeparator
ロケールに関連付けられた桁区切り文字のキーです。
対応する値はNSStringオブジェクトです。

NSLocaleCurrencySymbol
ロケールに関連付けられた通貨記号のキーです。
対応する値はNSStringオブジェクトです。

NSLocaleCurrencyCode
ロケールに関連付けられた通貨コードのキーです。
対応する値はNSStringオブジェクトです。

NSLocaleCollatorIdentifier
ロケールの照合識別子のキーです。
対応する値はNSStringオブジェクトです。
不明の場合はnilを返します。

NSLocaleQuotationBeginDelimiterKey
ロケールに関連付けられた開始引用符のキーです。
対応する値はNSStringオブジェクトです。

NSLocaleQuotationEndDelimiterKey
ロケールに関連付けられた終了引用符のキーです。
対応する値はNSStringオブジェクトです。

NSLocaleAlternateQuotationBeginDelimiterKey
ロケールに関連付けられた代替開始引用符のキーです。
いくつかのロケールでは、引用符がネスト(入れ子)されている時に代替引用符になります。
例えばNSLocaleQuotationBeginDelimiterKeyの後にNSLocaleAlternateQuotationBeginDelimiterKeyなどとなります。
対応する値はNSStringオブジェクトです。

NSLocaleAlternateQuotationEndDelimiterKey
ロケールに関連付けられた代替終了引用符のキーです。
いくつかのロケールでは、引用符がネスト(入れ子)されている時に代替引用符になります。
例えばNSLocaleQuotationEndDelimiterKeyの後にNSLocaleAlternateQuotationEndDelimiterKeyなどとなります。
対応する値はNSStringオブジェクトです。

localeIdentifier

- (NSString *)localeIdentifier

レシーバの識別子を返します。

これはNSLocaleが正規化する可能性があるので、ロケールが生成した文字列と同じ文字列であるとは限りません。

キーNSLocaleIdentifierobjectForKey:に送信するのと同等です。

NSLocalizedString

NSString *NSLocalizedString(NSString *key, NSString *comment)

文字列のローカライズバージョンを返します。

戻り値はメインバンドル上でnilテーブルでlocalizedStringForKey:value:table:を呼び出した結果です。

\\Uxxxxを使用してキーにUnicode文字列を指定することができます。

genstringsユーティリティの-uオプションを参照してください。

詳細についてはNSBundleを参照してください。

特別な考慮事項
Mac OS X v10.4以前では、genstringsユーティリティによって正確な構文解析を保証するために、keyパラメータにhigh-ASCII文字を含めることはできません。


4)shouldAutorotateToInterfaceOrientation:メソッド

shouldAutorotateToInterfaceOrientation:のコメントアウトを解除してデフォルトのまま実装しています。


5)viewDidUnloadメソッド

viewDidUnloadに6つのプロパティの所有権放棄を追加しています。


6)deallocメソッド

deallocに6つのプロパティの解放を追加しています。


●実行結果

現状で『ビルドと実行』を行うと下図のようになります。

7924

デフォルトの英語(米国)の状態は正しく表示されます。

ここで『Language(言語)』を『Francais(フランス語)』、『Region Format(地域)』を『France(フランス)』と設定してみます。

7926

すると、nibファイルやラベルの文字列、そしてアプリケーションのタイトルはまだフランス語用にローカライズしていませんので、左右5つずつのラベルや国旗はそのままですが、言語環境設定を取得して表示するビュー上方のラベルだけは対応して変化することが分かります。

7925

これから言語環境設定のラベル以外のローカライズを行います。


●nibファイルのローカライズ

nibファイルLocalizeMeViewController.xibをローカライズし、ビュー左側の5つのラベルと下方の国旗の画像をフランス語に対応させます。

Xcodeの『グループとファイル』ペインの『Resources』下にあるLocalizeMeViewController.xibファイルを右クリックし、『情報を見る』を選択します。

7927

下方にある『ファイルをローカライズ可能にする』ボタンをクリックします。

7928

するとタブが『一般』から『ターゲット』に移ると共に、LocalizeMeViewController.xibが階層化され、下に『English』と追加されます。

7929

これにより英語版のnibファイルが生成されたことになります。

この『English』という名前は自動的に決定される物で、LocalizeMe-Info.plistの『Localization native development region』の値を『en』としても自動生成される名称は変えられず、情報ウィンドウの一般タブにある『ローカリゼーション』で名称変更しようとしても強制的に『English』に戻され、またLocalizeMeViewController.xib下の『English』を変更することができないという頑固な仕様になっています。

7930

iOSアプリケーションプログラミングガイド』の『アプリケーションバンドル(p.31)』の『ローカライズ済みリソースを置くサブディレクトリ(p.33)』などで示されているように、サブフォルダ名は言語名(または言語環境(言語+地域)名)である必要があると示されているのに(EnglishやFrenchでも動作するとは言え)何故このような仕様だったのかは謎です。

現行のXcode4では『en』で自動生成されるようになったらしいので不要な話になってしまいますが、フランス語用のローカリゼーションを追加するついでに、English.lprojを削除してen.lprojに差し替えます。

まず情報ウィンドウの『一般』タブの下方にある『ローカリゼーションを追加』ボタンをクリックします。

『新しいローカリゼーションの名前を入力』と出てきますが、ドロップダウンメニューを利用せずに、手動入力で『en』と入力して『追加』ボタンをクリックし、同様にフランス語用のローカリゼーション『fr』も追加します。

7931

ローカリゼーションは個別に削除することができませんので、XcodeのLocalizeMeViewController.xib下にある『English』を右クリックし、『削除』→『一緒にゴミ箱に入れる』を選択します。

7932

これでXcode上では『English』ローカリゼーションは消えていますが、LocalizeMeプロジェクトのEnglish.lprojフォルダ内のLocalizeMeViewController.xibファイルが削除されただけでEnglish.lprojフォルダ自体は残ります。

7933

ここでEnglish.lprojフォルダも削除したいところですが、後で国旗の画像ファイルflag.pngなどをローカライズする際にまた自動生成されてしまうので、全てのファイルのローカライズが済んでから削除することにします。

さて、nibファイルLocalizeMeViewController.xibをローカライズしたことで、en.lprojフォルダとfr.lrojフォルダ下にはそれぞれLocalizeMeViewController.xibが存在しており、現状では同じ内容(英語版)ですので、フランス語版を修正します。

XcodeのLocalizeMeViewController.xib下にある『fr』をダブルクリックして、Interface Builderで開きます。

そして左側の5つのラベルのText(One、Two、Three、Four、Five)をフランス語(Un、Deux、Trois、Quatre、Cinq)に変更し、保存します。

7934

次に国旗の画像ファイルflag.pngをローカライズします。

nibファイルの場合と同様に、XcodeのResources下にあるflag.pngを右クリックし『情報を見る』で情報ウィンドウを開き、『一般』タブで『ファイルをローカライズ可能にする』ボタンをクリック、『ローカリゼーションを追加』でenとfrを追加、Xcodeに戻りflag.png下のEnglishを削除します。

7935

現状ではfr.lprojフォルダ下のflag.pngファイルはコピーされた米国旗のままですので、iOS 3.x版のサンプルコードの『17 LocalizeMe』の『fr.lproj』フォルダ内にあるflag.pngファイルを自身のLocalizeMeプロジェクトのフォルダ下にある『fr.lproj』フォルダに上書きコピーします。

そしてXcodeに戻り、『ビルド』メニューの『すべてのターゲットをクリーニング』を行い、一度Xcodeを閉じて再度開くとフランス語版のflag.pngが差し替わります。

7936

実行すると下図のようになります。

7937



参考文献

iOSアプリケーションプログラミングガイド

NSLocale Class Reference

Foundation Functions Reference

はじめてのiPhone3プログラミングはじめてのiPhone3プログラミング
(2009/12/17)
Dave Mark、Jeff LaMarche 他

商品詳細を見る

Beginning Ios 6 Development: Exploring the Ios SdkBeginning Ios 6 Development: Exploring the Ios Sdk
(2012/12/26)
David Mark、Jack Nutting 他

商品詳細を見る

LocalizeMe(1)

2012. 03. 12
諸事情により実機テストができない状態なので、(旧版における)以下の章の説明は割愛させていただきます。

・第14章 ここはどこ?Core Locationで行くべき道を探す(Core Locationによる現在位置の取得)
・第15章 やってしまった!(加速度センサの利用)
・第16章 iPhoneのカメラとフォトライブラリ(内蔵カメラの利用)

環境が整いましたら改めて説明したいと思います。

今回は本書では最後の章となる、アプリケーションのローカライズを行うLocalizeMeです。

ローカライズの処理に関してですが、ここで紹介する開発環境はXcode 3.2.6であり、Xcode 4.xとは異なる部分がありますので予めご了承ください。

LocalizeMeでは、以下のローカライズを行います。
・ユーザの設定している現在の言語環境を取得し、設定されている言語と書式をラベルで表示
・文字列ローカライズファイルによるラベルの文字列を差し替え
・nibファイルの差し替えによるラベルと画像の差し替え

初版およびiOS 3.x版のサンプルコードではアプリケーションアイコンの差し替えも行っていますが、iOS 4以降ではアイコンのローカライズができなくなったらしく、iOS 4.x版のサンプルコードでは省略されており、代わりにアプリケーションのタイトルのローカライズが追加されています。
(iOS 4におけるアイコンのローカライズ問題については『akalogue/iPhone SDKの教科書』や『Use Your Loaf/Blog/Localizing iPhone App Icon is not supported』を参照してください。)


●言語と書式

ローカライズは、ユーザの設定している言語環境に対しアプリケーションが対応していれば反映されるもので、対応の可否および対応する言語は開発者に依存します。

ユーザの言語環境はiOSのデフォルトアプリケーションである『Settings(設定)』から行います。

7903

『Settings(設定)』下にある『General(一般)』を選択します。

7904

『General(一般)』下にある『International(言語環境)』を選択します。

7905

アプリケーションのローカライズに最も関与するのが『Language(言語)』で、次に『Region Format(書式)』が重要になります。

7906

『Language(言語)』設定はローカライズの基本となる要素で、文字列や画像、nibファイルなどのリソースを振り分ける主条件となります。
(詳細は『言語環境の用語』や『言語環境の言語』を参照してください)

7907

『Region Format(書式)』は言語に地域情報を加えた要素で、同じ言語でも地域(国)による日付や数値の書式などの表記の差異を振り分けるための条件となります。
(詳細は『言語環境の書式』や『ロケールのリージョンコード』を参照してください)

7908

したがって今回のLocalizeMeのような、単純な文字列や画像の差し替えであれば『Language(言語)』毎のローカライズで済みますが、日付や数値の書式などが絡む場合は『Region Format(書式)』毎のローカライズが必要になります。

検索順序は『Region Format(書式)』→『Language(言語)』になります。


●プロジェクトの作成

View-based Applicationテンプレートで、プロジェクト名を『LocalizeMe』とします。

7815

7910


●LocalizeMeViewController.hヘッダファイルの編集

現在設定されている言語環境を表示するラベルlocaleLabelと、文字列ローカライズファイルによって差し替える文字列を表示するラベルlabel1~5のアウトレットの宣言を行います。
(太字が追加した部分)

#import <UIKit/UIKit.h>

@interface LocalizeMeViewController : UIViewController {
    UILabel *localeLabel;
    UILabel *label1;
    UILabel *label2;
    UILabel *label3;
    UILabel *label4;
    UILabel *label5;

}

@property (nonatomic, retain) IBOutlet UILabel *localeLabel;
@property (nonatomic, retain) IBOutlet UILabel *label1;
@property (nonatomic, retain) IBOutlet UILabel *label2;
@property (nonatomic, retain) IBOutlet UILabel *label3;
@property (nonatomic, retain) IBOutlet UILabel *label4;
@property (nonatomic, retain) IBOutlet UILabel *label5;


@end

7911


●アイコンと画像ファイルのコピーとプロジェクトへの追加

アプリケーションのアイコンとなるicon.pngとデフォルト(英語)時の国旗flag.pngファイルを、サンプルコードから自身のLocalizeMeプロジェクトのフォルダにコピーしてプロジェクトに追加します。

iOS 3.x版のサンプルコードの場合は『17 LocalizeMe/Resources/Base Language』(または『17 LocalizeMe/English.lproj』)フォルダ下、iOS 4.x版のサンプルコードの場合はアイコンは『19 - LocalizeMe』フォルダ下、国旗は『19 - LocalizeMe/en.lproj』フォルダ下にあります。

両ファイルとも自身の『LocalizeMe』フォルダ直下に置いてください。
(ローカライズするとファイルは自動的に『~.lproj』フォルダに移動されます)

7912

そして両ファイルをResources下に追加します。

7920


●LocalizeMeViewController.xibの編集

LocalizeMeViewController.hヘッダファイルの変更が終わったら保存し、ビューコントローラのnibファイルLocalizeMeViewController.xibを開いてラベルの追加を行います。


1)ラベルの追加

LibraryウィンドウのLabelを選択し、Viewウィンドウの上方に言語環境を表示するラベルを1つ、左側にnibファイルによるローカライズ用のラベル5つ、右側に文字列ファイルによるローカライズ用のラベル5つを設置します。

7913


2)ラベルへのアウトレットの接続

DocumentウィンドウでFile's Ownerを選択し、InspectorウィンドウでConnectionsタブを開き、OutletsのラベルlabelをViewウィンドウのラベルに接続します。

label1~5は右側の文字列ファイルによるローカライズ用のラベルに上から順に、localeLabelは上方の言語環境を表示するラベルに接続します。

7914


3)ラベルのサイズ変更

Documentウィンドウで各ラベルを選択し、InspectorウィンドウでSizeタブを開き、各ラベルのサイズを下表のように変更します。
(レイアウトはiOS 4.x版のサンプルコードに倣っています)

LabelXYWH
 localeLabel 202028057
 label1(左)2010613721
 label2(左)2013513721
 label3(左)2016413721
 label4(左)2019313721
 label5(左)2022213721
 label1(右)16310613721
 label2(右)16313513721
 label3(右)16316413721
 label4(右)16319313721
 label5(右)16322213721

7915


4)ラベルの属性変更

InspectorウィンドウのAttributesタブを開き、属性の変更を行います。

localeLabel)

LabelのLayoutのAlignmentを左揃えから中央揃えに、Fontを『Helvetica, 17.0』から『Helvetica Bold, 29.0』に、Textを『Default』からColor Palettesで『0000CC』に変更します。

7916

label1~5(左))

左側の5つのラベルはnibファイルによるローカライズですので、LabelのTextを上から順にOne、Two、Three、Four、Fiveに変更します。

7917

label1~5(右))

右側の5つのラベルは文字列ファイルによるローカライズですので、LabelのTextを変更する必要はありませんが、LayoutのAlignmentを左揃えから右揃えに変更します。

7918


5)Image Viewの追加

LibraryウィンドウのImage Viewを選択し、Viewウィンドウの下方に国旗を表示するイメージビューを設置し、InspectorウィンドウでSizeタブを開き、サイズをX:0、Y:251、W:320、H:218に変更します。
(レイアウトはiOS 4.x版のサンプルコードに倣っています)

7919


6)イメージビューの属性変更

ImageViewのImageでflag.pngを選択し、デフォルト(英語)時の国旗を設定します。

ViewのModeは『Scale To Fill』(UIViewContentModeScaleToFill:画像の縦横比を無視し、ビュー境界に合わせて拡大縮小)から『Aspect Fit』(UIViewContentModeScaleAspectFit:画像の縦横比を維持し、ビュー境界に合わせて拡大縮小)に変更します。

これは国旗画像の縦横比が統一されていないことへの対処ですが、画像とビュー境界の隙間が透明となるため、デフォルトでチェックされているDrawingの『Opaque』(opaque:ビューが不透明)と『Clear Context Before Drawing』(clearsContextBeforeDrawing:描画前に透明な黒でクリア)のチェックが外されています。

7921

全ての変更が済んだらnibファイルを保存します。

7922


●LocalizeMeViewController.mソースファイルの編集

6つのラベルのプロパティの実装と、viewDidLoadメソッドへのコード追加を行います。
(太字が追加した部分)

#import "LocalizeMeViewController.h"

@implementation LocalizeMeViewController

@synthesize localeLabel;
@synthesize label1;
@synthesize label2;
@synthesize label3;
@synthesize label4;
@synthesize label5;


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.

- (void)viewDidLoad {
    [super viewDidLoad];

    NSLocale *locale = [NSLocale currentLocale];
    NSString *displayNameString = [locale displayNameForKey:NSLocaleIdentifier value:[locale localeIdentifier]];
    localeLabel.text = displayNameString;

    label1.text = NSLocalizedString(@"One", @"The number 1");
    label2.text = NSLocalizedString(@"Two", @"The number 2");
    label3.text = NSLocalizedString(@"Three", @"The number 3");
    label4.text = NSLocalizedString(@"Four", @"The number 4");
    label5.text = NSLocalizedString(@"Five", @"The number 5");

}

// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;

    self.localeLabel = nil;
    self.label1;
    self.label2;
    self.label3;
    self.label4;
    self.label5;
    [super viewDidUnload];

}

- (void)dealloc {
    [localeLabel release];
    [label1 release];
    [label2 release];
    [label3 release];
    [label4 release];
    [label5 release];

    [super dealloc];
}

@end

7923


1)プロパティの実装

ヘッダファイルで宣言した6つのラベルのプロパティを@synthesizeで実装します。


2)不要なメソッドの削除

テンプレートで自動生成されるメソッドの内、initWithNibName:bundle:loadViewは今回使用しないので削除します。



参考文献

akalogue/iPhone SDKの教科書

Use Your Loaf/Blog/Localizing iPhone App Icon is not supported

はじめてのiPhone3プログラミングはじめてのiPhone3プログラミング
(2009/12/17)
Dave Mark、Jeff LaMarche 他

商品詳細を見る

Beginning Ios 6 Development: Exploring the Ios SdkBeginning Ios 6 Development: Exploring the Ios Sdk
(2012/12/26)
David Mark、Jack Nutting 他

商品詳細を見る

CheckPlease(2)~Gesture Recognizer

2012. 03. 11
iOS 4.x版のサンプルコードでは『CheckPlease(1)~イベント処理メソッド』内容をGesture Recognizerを使用する方法に書き換えています。

とは言っても、カスタムジェスチャを認識する部分は既存の具象Gesture Recognizerクラスを利用できるわけではないので、抽象基底クラスであるUIGestureRecognizerクラスのサブクラスを作成し、そこにイベント処理メソッドによるカスタムジェスチャ認識コードを移植することになります。

ここではイベント処理メソッド版のCheckPleaseプロジェクトを改造してGesture Recognizerに対応させるので、必要な場合は別のフォルダにコピーするなどしてください。


●CheckPleaseViewController.xibファイル

iOS 4.x版のサンプルコードではラベルのText属性に『Label』と入ったまま(なので、起動時にLabelと表示される)ですが、特に必要無いので(イベント処理メソッド版)そのままにしておきます。


●CGPointUtilsクラスのファイル

iOS 4.x版のサンプルコードではCGPointUtilsクラスのファイルが、Classes下ではなく、Other Sourcesに置かれていますが、実用上は問題無いので(イベント処理メソッド版)そのままにしておきます。


●CheckMarkRecognizerクラスの追加

カスタムジェスチャを認識するためのUIGestureRecognizerクラスのサブクラスCheckMarkRecognizerクラスを追加します。

Xcodeの『グループとファイル』ペインにある『Classes』を選択して右クリックし、『追加』→『新規ファイル...』を選択します。

7891

iOSグループの『Cocoa Touch Class』を選択し、『Objective-C Class』を選択、Subclass ofは『NSObject』にして『次へ』進みます。

7892

ファイル名をCheckMarkRecognizerとし、ヘッダファイルも同時に作成します。

7893


●CheckPleaseViewController.hヘッダファイルの編集


追加したCheckMarkRecognizerクラスへコードの一部を移植します。

カスタムジェスチャを認識するための3つの定数の宣言はCheckMarkRecognizer.mソースファイルへ、座標と移動距離を示す3つのインスタンス変数の宣言はCheckMarkRecognizer.hヘッダファイルへ移動させます。

ラベルを消去するeraseLabelメソッドの宣言はクラス内部でのみ使用するからか、iOS 4.x版のサンプルコードでは削除されています。

したがってCheckPleaseViewController.hではラベルのアウトレットの宣言のみとなります。

CheckPleaseViewController.hヘッダファイル)

#import <UIKit/UIKit.h>

@interface CheckPleaseViewController : UIViewController {
    UILabel *label;
}

@property (nonatomic, retain) IBOutlet UILabel *label;

@end

7894

CheckMarkRecognizer.hヘッダファイル)

#import <Foundation/Foundation.h>

@interface CheckMarkRecognizer : NSObject {
    CGPoint lastPreviousPoint;
    CGPoint lastCurrentPoint;
    CGFloat lineLengthSoFar;

}

@end

7895

CheckMarkRecognizer.mヘッダファイル)

#import "CheckMarkRecognizer.h"

#define kMinimumCheckMarkAngle 50
#define kMaximumCheckMarkAngle 135
#define kMinimumCheckMarkLength 10


@implementation CheckMarkRecognizer

@end

7896


●CheckPleaseViewController.mソースファイルの編集

追加したCheckMarkRecognizerクラスへのコードの一部の移植と、それに伴う改修を行います。

ジェスチャ認識のコードをCheckMarkRecognizerクラスへ移植するので、CGPointUtils.hのインポートはCheckMarkRecognizer.mソースファイルに移動し、代わりにCheckMarkRecognizer.hヘッダファイルをインポートします。

touchesMoved:withEvent:メソッド内でジェスチャを認識した際に行っていたラベルの表示と消去のコードはビューコントローラ側に残すので、doCheck:メソッドとして独立させます。

またビューにGesture Recognizerを追加するため、viewDidLoadメソッドを追加してCheckMarkRecognizerの生成と初期化を行い、addGestureRecognizer:で追加します。

touchesBegan:withEvent:メソッドとtouchesMoved:withEvent:メソッドはCheckMarkRecognizer.mソースファイルに移動し、それぞれsuperクラスによる初期化を追加します。

それとtouchesMoved:withEvent:メソッドは、ジェスチャ認識時の処理としてdoCheck:メソッドとして独立させたコードの代わりに、stateプロパティをUIGestureRecognizerStateEnded状態にします。

これによりジェスチャが認識されると、viewDidLoadメソッド内のinitWithTarget:action:メソッドでセレクタに設定していたdoCheck:メソッドが呼び出されることになります。

CheckPleaseViewController.mソースファイル)

#import "CheckPleaseViewController.h"
#import "CheckMarkRecognizer.h"

@implementation CheckPleaseViewController

@synthesize label;

- (void)doCheck:(CheckMarkRecognizer *)check {
    label.text = @"Checkmark";
    [self performSelector:@selector(eraseLabel) withObject:nil afterDelay:1.6];
}

- (void)eraseLabel {
    label.text = @"";
}


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.

- (void)viewDidLoad {
    [super viewDidLoad];

    CheckMarkRecognizer *check = [[[CheckMarkRecognizer alloc]
        initWithTarget:self action:@selector(doCheck:)] autorelease];
    [self.view addGestureRecognizer:check];
}


// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;

    self.label = nil;
    [super viewDidUnload];

}

- (void)dealloc {
    [label release];
    [super dealloc];
}

@end

7897

CheckMarkRecognizer.mソースファイル)

#import "CheckMarkRecognizer.h"
#import "CGPointUtils.h"

#define kMinimumCheckMarkAngle 50
#define kMaximumCheckMarkAngle 135
#define kMinimumCheckMarkLength 10


@implementation CheckMarkRecognizer

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];

    UITouch *touch = [touches anyObject];
    CGPoint point = [touch locationInView:self.view];
    lastPreviousPoint = point;
    lastCurrentPoint = point;
    lineLengthSoFar = 0.0f;
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesMoved:touches withEvent:event];

    UITouch *touch = [touches anyObject];
    CGPoint previousPoint = [touch previousLocationInView:self.view];
    CGPoint currentPoint = [touch locationInView:self.view];
    CGFloat angle = angleBetweenLines(lastPreviousPoint, lastCurrentPoint,
        previousPoint, currentPoint);

    if (angle >= kMinimumCheckMarkAngle && angle <= kMaximumCheckMarkAngle &&
        lineLengthSoFar > kMinimumCheckMarkLength) {
            self.state = UIGestureRecognizerStateEnded;
    }

    lineLengthSoFar += distanceBetweenPoints(previousPoint, currentPoint);
    lastPreviousPoint = previousPoint;
    lastCurrentPoint = currentPoint;
}


@end

7898


●CheckMarkRecognizer.hヘッダファイルの編集

NSObjectのサブクラスとして生成したCheckMarkRecognizerクラスのスーパークラスをUIGestureRecognizerクラスに修正します。
(太字が修正した部分)

#import <Foundation/Foundation.h>

@interface CheckMarkRecognizer : UIGestureRecognizer {
    CGPoint lastPreviousPoint;
    CGPoint lastCurrentPoint;
    CGFloat lineLengthSoFar;
}

@end

7899


●CheckMarkRecognizer.mソースファイルの編集

UIGestureRecognizerクラスの『サブクラス化の注意』で触れられていますが、UIGestureRecognizerの具象サブクラスを生成する場合は、UIGestureRecognizerSubclass.hヘッダファイルをインポートする必要があるので追加します。
(太字が追加した部分)

#import "CheckMarkRecognizer.h"
#import "CGPointUtils.h"
#import <UIKit/UIGestureRecognizerSubclass.h>

#define kMinimumCheckMarkAngle 50
#define kMaximumCheckMarkAngle 135
#define kMinimumCheckMarkLength 10

@implementation CheckMarkRecognizer

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];

    UITouch *touch = [touches anyObject];
    CGPoint point = [touch locationInView:self.view];
    lastPreviousPoint = point;
    lastCurrentPoint = point;
    lineLengthSoFar = 0.0f;
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesMoved:touches withEvent:event];

    UITouch *touch = [touches anyObject];
    CGPoint previousPoint = [touch previousLocationInView:self.view];
    CGPoint currentPoint = [touch locationInView:self.view];
    CGFloat angle = angleBetweenLines(lastPreviousPoint, lastCurrentPoint,
        previousPoint, currentPoint);

    if (angle >= kMinimumCheckMarkAngle && angle <= kMaximumCheckMarkAngle &&
        lineLengthSoFar > kMinimumCheckMarkLength) {
            self.state = UIGestureRecognizerStateEnded;
    }

    lineLengthSoFar += distanceBetweenPoints(previousPoint, currentPoint);
    lastPreviousPoint = previousPoint;
    lastCurrentPoint = currentPoint;
}

@end

7900



参考文献

iOSイベント処理ガイド

UIGestureRecognizer Class Reference

はじめてのiPhone3プログラミングはじめてのiPhone3プログラミング
(2009/12/17)
Dave Mark、Jeff LaMarche 他

商品詳細を見る

Beginning Ios 6 Development: Exploring the Ios SdkBeginning Ios 6 Development: Exploring the Ios Sdk
(2012/12/26)
David Mark、Jack Nutting 他

商品詳細を見る






SoundSport Pulse wireless headphones
Calendar
04 | 2017/05 | 06
Sun Mon Tue Wed Thu Fri Sat
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

SoundSport Pulse wireless headphones
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR