2008年6月28日土曜日

iPhone SDK β8

iPhone SDKのサイトを見るとβ8が上がっていました。今試しているAppleのサンプルコードとどの程度互換性があるか気になります。アンインストールの方法は書いてはいるものの、面倒なことに替わりありません(笑)

readmeによると、このベータ8はiPhone 2.0の最終版と互換性があり、App Storeに登録するiPhone OSアプリケーションに使うように書いています。登録するためにはiPhone Developer Programの会員になるように、とも書いています。あとは、例によってインストールとアンインストールの注意書きです。

Creating an iPhone Applicationその3

Creating an iPhone Application
http://developer.apple.com/iphone/gettingstarted/docs/creatingiphoneapps.action

"Creating an iPhone Applicationその2"のメモの続きです。他のメモと同様に翻訳じゃないのでたくさん抜けていますし、たくさん間違っているハズですが、原文を読むときの参考にはなると思います。

■ Drawing the Welcome Button
UIKitが提供している標準的なViewは単純な内容であれば変更なしに表示できて、イメージならUIImageView、文字列ならUILabelが使えます。アプリケーションMoveMeだと、UIViewオブジェクトのbackgroundColorプロパティで背景色を初期化メソッドで描画しています。backgroundColorプロパティはInterface BuilderでnibファイルMoveMeView.xib内のMoveMeViewを作るときにInspectorウィンドウのAttributeタブで設定しています。複雑な背景が必要なときにはUIKitの棒が機能か、QuartzやOpenGL ESを利用できます。

アプリケーションMoveMeのPlacardViewクラスはWelcomeボタンの描画とスクリーン上の位置管理をします。PlacardViewクラスはすべてのプロセスを紹介するために、あえて前述のUIImageViewやUILabelを使わずに描画しています。描画はPlacardView.mファイル内のdrawRect:メソッドで行われています。

drawRect:メソッドが呼び出された時点で、描画のための環境は利用可能になっていますので、必要な描画命令を発効するだけです。PlacardViewクラスの描画内容はPlacard.pngで描かれたバックグランドとテキストで、テキストは逐次変更することが出来ます・・・とここでPlacard.pngの描画が気になって調べてみると、PlacardView.mファイル内でinitメソッドでPlacard.pngイメージ ファイルを読み込み、placardImageオブジェクトに入れてdrawRect内でdorawATPointメソッドで位置を指定して描画していて、確かに描画の手順が詳しく分かるようになっています・・・解説文に戻ると、処理の手順が示されています。

1.現在のView座標0にボタンの背景イメージを描画しています。この時にViewの大きさはイメージに合うようになっていて、ボタン全体が描画されています。

2.ボタンの中央に来るようにWelcom文字列の位置を計算します。この文字列はさまざまに変わるので、毎回計算しなくてはなりません。

3.描画色を黒に設定します。([[UIColor blackColor] set]のことを言っているのであろうが、この行をコメントアウトしても結果は変わりません。おそらく初期値が黒なのでしょう)

4.文字列をずらせて描画

5.描画色を白に設定します。

4.文字列を描画します。

Listing 4では、placardImageメンバ変数がボタン背景の入ったUIImageオブジェクトを保持し、currentDisplayStringメンバ変数が文字列の入ったNSStringオブジェクトを保持しています。イメージを描画した後で、文字列の位置を計算しtextSizeメンバ変数にいれます。文字列は陰を付けるために黒と白で二回描画されています。描画はNSStringのメソッドで行なわれています。

前述のように複雑な描画をするときにはQuartzかOpenGL ESが利用できますが、QuartzはUIKitと共にベクトル パス、イメージ、PDFなどを描画できます。QuartzとUIKitは同じ描画環境ですので、drawRect:メソッドから呼び出せます。

OpenGL ESは2Dや3Dの描画ができますが、drawRect:メソッドは利用できません。ViewはOpenGL ESの表面描画に利用されます。表面描画に利用するオブジェクトの選択や描画頻度は自由に決められます。

詳細は"iPhone OS Programming Guide"の"Graphics and Drawing"の項目を見ろと書かれています。

■ Handling Touch Events
マルチタッチ インタフェースの処理ですが、とうぜん既存のマウス処理とは異なります。2番目以降の指が触れる度にタッチ イベントが発行されます。また、画面にふれているそれぞれの指が移動しても、指が画面から離れてもタッチ イベントが発行されます。

一本の指で操作後にもう一本の指が追加されることは想定しておらず、この単純化でジェスチャを識別しやすくしています。システムはswipesなどの共通のジェスチャを識別する方法を手今日していますが、独自に複雑なジェスチャ識別をさせることもできます。新しいタッチイベントが生成されたときに、各指がタッチしているか、離れたかなどの情報も提供されます。これにより、新しいタッチイベントが発生する度に、各指の動きを追跡できます。Figure 4に示すようなピンチ クローズやピンチ オープンのジェスチャのイベントが発生すると、Viewがサポートしている拡大縮小としてズームのレベルを変更できます。

システムはUIResponderクラスをインスタンスしたオブジェクトにイベントを配信します。アプリケーションMoveMeでは二つのViewクラスを利用していますが、MoveMeViewクラスがイベントを処理します。このクラスはタップがWelcomeボタンの内側で発生したのか外で発生したのかの識別をUIResponderのメソッドをオーバライドすることで実現しています。

単純にするためにアプリケーションMoveMeでは最初にタッチした指だけを追跡します。UIViewクラスが初期値でマルチタッチ イベントOFFの状態であることを利用しています。マルチタッチ イベントがOFFだと、システムは最初にタッチした指が生成するイベントのみを配信します。マルチタッチのイベントが必要な場合にはUIViewクラスのsetMultipleTouchEnabled:メソッドを利用します。

イベント処理の一貫として、MoveMeViewクラスは以下の手順を踏みます。

1.最初のタッチイベントが届くと、発生した場所を調べます。
 ・ボタン外でのダブルタップ - 文字列の変更
 ・ボタン内でのシングルタップ - ボタンの中央を指の下に移動し、ボタンを拡大してアニメーションを初期化
 ・他のタッチは無視

2.ボタン内をタッチしている指が移動すると、新しい位置にボタンの位置を変更します。

3.ボタン内をタッチしている指が離れるとボタンを中央に戻すアニメーションを始めます。

Listing 5ではMoveMeView.mファイル内のMoveMeView用touchesBegan:withEventメソッドを示しています。touchesBegan:withEventメソッドはUIResponder.hで宣言されています。指が最初にふれるとシステムはこのメソッドを呼び出します。このメソッドはすべてのタッチを取得するので、その中から一つだけを取り出します。UITouchオブジェクトはMoveMeViewオブジェクトとPlacardViewオブジェクトのいずれでタッチイベントが発生したかと、その回数を調べるために使用されます。もし、ボタン外でダブルタッチが発生するとtouchesBegan:withEventメソッドはWelcomeボタンのもじれとを次の文字に入れ替えるためにsetupNextDisplayString:メソッドを呼び出します。また、ボタン内の場合にはボタンを拡大してタッチされた場所を追跡するためにanimateFirstTouchAtPoint:メソッドを呼び出します。他のイベントは無視されます。

Listing 6ではMoveMeViewクラスのtouchesMoved:withEvent:メソッドを示しています。指が触れて移動したときにシステムはこのメソッドを呼び出します。最初に指が触れた場所に関係なくこのメソッドは呼び出されますので、アプリケーションMoveMeではボタン内でイベントが発生しているかを調べ、その場合にはPlacardViewオブジェクトの中心を設定しなおし再描画しています。

Listing 7 ではtouchesEnded:withEvent:メソッドを示しており、指が離れるとシステムはこのメソッドを呼び出します。アプリケーションMoveMeではボタンを画面中央に戻すアニメーションを実行します。

アプリケーションのイベント取扱を簡素化するために、ボタンが元に戻るアニメーション期間中はViewのtouchesEnded:withEvent: メソッドを不可にしています。もし、不可にしないと、各イベント処理メソッドはボタンがアニメーション中であるかと、アニメーションのキャンセルを識別するコードが必要なります・・・などなど説明が書かれています。ボタンが元の位置に戻ると、MoveMeViewクラスのanimationDidStop:finished:メソッドがユーザからの入力を可能にします。

詳細は"iPhone OS Programming Guide"の "Event Handling"の項目を見ろと書いています。

・・・と、このページは意外と長くて、まだまだ続きます(笑)

2008年6月26日木曜日

Creating an iPhone Applicationその2

Creating an iPhone Application
http://developer.apple.com/iphone/gettingstarted/docs/creatingiphoneapps.action

"Creating an iPhone Applicationその1"のメモの続きです。その1と同様に翻訳じゃないのでたくさん抜けていますし、たくさん間違っているハズですが、原文を読むときの参考にはなると思います。

■ Defining the Application Delegate
MoveMeのApplication DelegateクラスはMoveMeAppDelegate.hとMoveMeAppDelegate.mにあります。

Application DelegateオブジェクトはUIApplicationオブジェクトと共にアプリケーションの状態が変化したときに機能します。

 アプリケーションのウィンドウを設定し、ユーザインタフェースを初期化
 アプリケーション内で独自作成したデータ エンジンの初期化
 アプリケーション内のURLを開く
 装置の方向が変化するとそれに応答する
 終了要求の処理

アプリケーションの起動時にDelegateオブジェクトがすることは設定とウィンドウの提供で、詳細は次の項目で説明しています。また、Delegateでは前回終了したときの状態を復帰し、必要なオブジェクトを生成します。アプリケーションが終了する時もDelegateが終了処理を行い、次回の起動時に必要な情報を記録します。詳細はiPhone OS Programming Guideの"Core Application Architecture"を参照してください、と書いているのでここでそれぞれ対応するメソッドが書かれているのでしょう。

■ Creating the Application Window
UIWindowクラスは一つのウィンドウのみを扱い、ユーザインタフェースを変えるときにはViewを変えまるそうで、言い方を変えるとウィンドウはユーザインタフェースを置く場所を提供し、Viewが中身を提供する、という事だそうです。ViewはUIViewクラスのインスタンスでウィンドウの中身を書き、応答します。iPhoneはテーブル、ボタン、テキスト フィールドなどの標準Viewを提供していますが、UIViewをサブクラスすることで独自のユーザインタフェース部品を作成できます。MoveMeではMoveMeViewとPlacardViewの二つを作成しています。一つはアプリケーションのインタフェース、もう一つはユーザへの応答処理です。

起動時にはウィンドウを表示して内容を表示します。ウィンドウはnibファイルのMainWindow.xibから取り出します。アプリケーションがlauchedの状態になり、イベント処理が始まると、UIApplicationオブジェクトはDelegateにapplicationDidFinishLaunching:メッセージを送ります。メッセージはDelegateがウィンドウの内容描画するきっかけとなり、アプリケーションが必要な他の初期化を行います。

MoveMeでは、DelegateのapplicationDidFinishLaunching:メソッドは以下のことを行います。

1.ウィンドウのView内容を管理するView Controllerオブジェクトを生成
2.MoveMeViewクラスのインスタンスでView Controllerを初期化します。MoveMeViewクラスはnibファイルMoveMeView.xibに入っており、背景のViewとしてウィンドウのフレーム全体を埋めます。
3.ウィンドウのSubviewとしてControllerのViewを追加します。
4.ウィンドウを表示します。

Listing 2はMoveMeのapplicationDidFinishLaunching:メソッドで、MoveMeAppDelegate.mで宣言されています。この中ではウィンドウ内の主なViewを生成し、ウィンドウを表示しています。ウィンドウを表示することにより、システムはイベント処理を開始して良いことを知ります。

applicationDidFinishLaunching:メソッドは他のアプリケーションでも利用されるそうです。ここまでソースコードを見ずにメモをとり続けましたが、applicationDidFinishLaunchingが宣言されているUIApplication.hを見ると他にも色々と関数(メソッド)が並んでいます。

MoveMeViewオブジェクトがnibファイルから取り出されると、MoveMeView.m内のinitWithCoder:メソッドが呼ばれるそうです。このinitWithCoderの詳細は"NSCoding Protocol Reference"に書かれているのでしょう。initWithCoderはMoveMeViewクラスを呼び、さらに同じファイル内のsetUpPlacardViewメソッドがPlacardViewクラスを呼び出して、Welcomeボタンを表示する・・・と言うことだそうです。

Listing 3はMoveMeView.m内のsetUpPlacardViewメソッドです。このViewの初期化部分ではMoveMeView.hで宣言されたPlacardViewオブジェクトが生成されます。MoveMeViewクラスはアプリケーション全体の背景を提供するため、PlacardViewオブジェクトをSubviewとして追加します。二つのViewの関連は、アプリケーションの背景上にWelcomeボタンを表示することと、ボタンに対するイベント処理をMoveMeViewにさせることです。このplacardViewが良くわからなくて、その宣言に@implementation MovideMeViewの直下で@synthesizeというのが使われています。WindowとViewの詳細は"iPhone OS Programming Guide"の"Windows and Views"の項目を見ろと書かれています。

2008年6月25日水曜日

Creating an iPhone Applicationその1

Creating an iPhone Application
http://developer.apple.com/iphone/gettingstarted/docs/creatingiphoneapps.action

上記資料のメモです。翻訳じゃないのでたくさん抜けています。

この資料はサンプルコード"MoveMe"を元に基本的なiPhoneのプログラミングを解説しています。面白いことにiPhone Dev Centerのトップにはこのサンプルコードへのアンカーがありません。試した限りではSDK beta 7で修正なしでコンパイルし実行できました(笑)ただ、ReadMe.txtをみるとバージョンアップを重ねていて、私が試したのは2008/06/02付けのバージョン2.5です。

このサンプルでは以下のiPhoneとして典型的な処理を含んでいるそうです。

アプリケーション初期化
ウィンドウ表示
内容描画
タッチ イベント処理
アニメーション実行

Figure 1が実行結果で"Welcome"ボタンを押すとボタンのサイズが大きくなり、押したまま指を動かすとボタンが指の動きについて来るというものです。また、ボタン以外の場所をダブルタップすると"Welcome"が日本語も含む各国の言葉に変わります。

Figure 1
http://devimages.apple.com/iphone/gettingstarted/docs/images/MoveMe.jpg

ここで、予め読んでいた方がよい資料を三つ上げています。

以下の三つの項目はXcodeを知らない人向けです。
 ■ Examining the MoveMe Sample Project
 ■ Building the MoveMe Application
 ■ A Word About Memory Management
なお、私が試した環境ではActive SDKメニューは表示されておらず、ツールバーのカスタマイズの中に入ったままでした。ただ、ボタンが並びすぎるのは好みではないので、メニューで確認しました。

メモリに制限のある環境での開発経験がない人は、メモリ管理の後半部分は目を通した方がよいかもしれません。

■ Initializing the MoveMe Application
この部分はMac OS Xと関数名などが多少異なっているが基本的に同じです。

iPhoneのヘルプファイル

以下のサイトはiPhoneのヘルプファイルですが、iPhoneにあわせたHTMLのサンプルとして便利そうです。

iPhone User Guide
http://help.apple.com/iphone/guide/

ソースコードを見ると、index.cssにDashcodeを使って書いたとあります。Dashcodeをちらりと見ただけで試していませんが、iPhone用のHTML作成ツールとして勉強する価値がありそうです。

2008年6月24日火曜日

Tools for iPhone OS Development and ...

Tools for iPhone OS Development
http://developer.apple.com/iphone/gettingstarted/docs/iphonedevtools.action

Learning Objective-C: A Primer
http://developer.apple.com/iphone/gettingstarted/docs/objectivecprimer.action

この資料に限らず、HTMLの資料は動画の説明とほぼ同じ内容か、拡張した内容のようです。ビデオでうまく理解できなかった内容を確認するには良さそうです。

iPhone OS Overview

iPhone OS Overview
http://developer.apple.com/iphone/gettingstarted/docs/iphoneosoverview.action

iPhoneの一番下にあるCore OSはMac OS Xと同じMachカーネルを元にしているとしていますが、Mac OS XのDarwinカーネルのようなMachカーネルとI/O Kitの組み合わせ、とは書いていません(笑)

Core OSとCore Servicesが提供するインタフェースはC言語ベースで以下のようなものが含まれています。
 Core Foundation
 CFNetwork
 SQLite
 access to POSIX threads
 UNIX sockets

上位のレイヤではC言語とObjective-Cベースで、メディア レイヤを例にするとC言語ベースのOpenGL ES、Quartz、Core Audio、Objective-CベースのCore Animationが含まれています。

Cocoa TouchレイヤではほとんどがObjective-Cベースです。Foundationフレームワークはファイル管理やネットワークなどを提供し、UIKitフレームワークはWindows、View、Controlそして、各オブジェクトを管理するcontrollerなどを提供しているそうです。

システムが起動できるアプリケーションの数は一度に一つだけで、アプリケーションは画面などハードウェアを占有できます。また、iPhoneのViewやControlはMac OS Xとは違いがあるので注意が必要だと書いています。

iPhone OSのイベント処理もタッチパネルなど今までと異なるので既存のOSとは異なり、今までのアプリケーション開発とは別のものとして考察する事になるそうです。

開発の手始めはFoundationとUIKitのフレームワークで、資料を読み始めるように書いています。

Foundation Framework Reference
http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/ObjC_classic/index.html

UIKit Framework Reference
http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIKit_Framework/index.html

iPhone OS Programming Guide: Introduction
http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Introduction/chapter_1_section_1.html

Open Source

Appleが主催するdarwin-devのMailing listにAppleのDarwin TeamのWilliam SiegristがDeveloper Tools 3.1.3とiPhone OS 3.0関連のソース一部を公開したと投稿していました。 Developer To...