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

2008年6月18日水曜日

iPhone SDK β7

iPhone SDKのサイトを見るとβ7が上がっていました。以前は新しい版がアップされるとメールで案内が来ていましたが、最近は来なくなりました。iphone_sdk__9m2199__wwdc08.dmgというファイル名から推測するとWWDC 2008で配布されたものと思われます。

この版からiPhone用のプロジェクト テンプレートの数が6つになり、Cocoa Touchという名前が消えました。どういう訳か資料からもCocoa Touchという名前が消えているようです。

以前から思っているのですが「新規プロジェクト」の画面左側はiPhone OSとMac OS Xの二つに分類されているですが、各項目がネストしていないうえに、iPhone OSには項目が一つしかないので分かりにくいです。

2008年6月14日土曜日

WWDCで発表せず

WWDC 2008でiPhone SDKの正規版は発表されなかった。

ここに書いた内容もまだしばらくは非公開のままである。

2008年6月13日金曜日

1-10 iPhone SDK for Web Developers.m4v

ビデオのメモ

Web技術
 Java script
  getElementsBy_Class_Name_
   エレメントのアレイを返す
  var myDivs = document.get getElementsBy_Class_Name_("myDivClass")

   Selectors API
   CSSのセレクタを得る
  var fooOrBar = document.querySelector("#foo, #bar"); // 次のセレクタ
  var warnings = document.querySelectorAll("p.warning") // 全てのセレクタ

 Native SVG ベクトル画
  Scalable Vector Graphics 1.1
  <img src="asf-logo.svg" style="height:90%;width:90%;">
  background-image: url("asf-log.svg")

 CSS Effect アニメーション
  変形(回転など)
   -webkit-transform : trasform_function
   -webkit-transform-origin : 3dpoint trasform_function

   skew(angle)ひねり
   scale(number)拡大縮小
   rotate(angle)回転
   translate(number)移動
  移動
   -webkit-transition-property : opacity; //透明などのスタイル
   -webkit-transition-duration : 2s; // 2秒で移動
   -webkit-transition-timing-function : linear; // 移動速度
   -myyElement.style.opacity = "10%"; // 最終の透明度

  アニメーション CSS Animation
   -animation-name : 'bounce'; // キーフレーム名の指定
    キーフレームの例
    @keyframes 'bounce' {
     0 { top: 100px; }
     25% { top: 150px; }
     50% { top: 200px; }
     75% { top: 150px; }
     100% { top: 100px; }
   -animation-duration : '2s'; // アニメーションの時間
   -animation-iteration-count : 1; // 繰り返し回数
  アニメーションはハードウェアで実行

  offline Data クライアント側のデータベースAPI
   HTML 5規格
   JavaScript API
    openDatabase
     myDB = openDatabase("noteDB", "1.0", "My Database", 200000);
     データベース名、バージョン、概要、サイズ
    executeSQL
     myDB.executeSql("INSERT INTO NoteTable (id, note,) VALUES ( ?, ?)", [note.id, note.text]);
   SQL syntaxが使える
   Transactionをサポート
   セキュア 同じドメインのみアクセス

  フル スクリーン モード
   SafariのURL欄とToolbarを表示せずにWebサイトを表示できる
   Homeスクリーン アイコンが必要
    apple-touch-icon.png または
    <link rel="apple-touch-icon" href="/customIcon.png"/>
   メタタグも必要
    <meta name="apple-touch-fullscreen" content="YES" />

  ジェスチャ イベント
   JavaScriptのハンドラ
    gesturestart
    gesturechange
    gestureend
   回転、拡大縮小ができる
    <div ongesturestart="handleGesture()"> </dive>
   mouseEventsの代用

ツール
 iPhone Simulator
 Dashcode

1-09 Leveraging iPhone Location, Acceleration, Orientation, and System Information.m4v

ビデオのメモ

静的情報
 システムの情報
  System name
  System version
  Model name
   iPhone
   iPod touch
  User Name
   SettingとiTunesで表示されている内容
 取得方法

  UIDevice * myCurrentDevice = [UIDevice currentDevice];

  NS Log (@"%@ is an %@ running %@", [myCurrentDevice neme],
    [myCurrentDevice model],
    [myCurrentDevice systemVersion[);

  出力結果
   "Vicki's Music is an iPod touch running version 1.3"
 Unique IDが聞き事に提供されている
 オリエンテーション
  縦上、縦下、右横、左横、下向き、上向き、不明を知ることができる
  情報はPropertyやNotification設定で入手
  UIDevice.hで宣言
動的情報
 位置情報
  緯度 経度 高度 計測時そして前回の計測時が提供
  CLLocationManager
  消費電力に注意
  
 加速度センサ情報
  ゲームだけでなくユーザインタフェースとしても有用
  iPhoneを縦に置いて
   X方向 水平 右が+
   Y方向 垂直 上が+
   Z方向 前後 前が+
  UIAccelerometer 一定時間ごとに情報を入手
  UIAcceleration 呼び出したときのみ
  消費電力に注意

1-08 Key Practices for iPhone Application Development.m4v

ビデオのメモ

1.iPhone用に設計
 設計の善し悪しがパフォーマンスに影響
 使い方の違いを考慮
 小さな画面サイズ
 アプリケーションは一つだけ起動

2.メモリ保護
 スワップ ファイルはない
 メモリスペースが無くなると再起動
 害像ファイルフォーマットはPNG
 Plistはバイナリに変換
 バイナリはThumb命令セット
  ARM 16 bit命令のサブセット
 メモリ リークをなくす
 Instrumentsを使って確認
 不要メモリは即座に解放
 アロケート プールの使用

- (NSString *) modifyMyString:(NSString *(myString {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
/* メモリをアロケートする*/
[pool release];
}

 独自でメモリスワップのファイルを作成する
 データのロードを最小限にする。
  一画面に表示しきれない情報は小分けにしてロード
 メモリ残警告は以下の三通りで、UIKit経由
  application delegate経由
   applicationDidReceiveMemoryWarning;
 UIViewControllerのサブクラス時
  didReceiveMemoryWarning
 ノティフィケイション経由
  UIApplicationDidReceiveMemoryWarningNotification
 メモリ残警告の処理
 off-screen viewを解放
 キャッシュをパージ
 イメージデータのキャッシュ削除
3.応答性
 起動を速くすることが重要
 終了時に現状を記録し、次回起動時に戻す
 20秒以内に応答、起動、終了
4.省エネ
 データの送受信は電力消耗が大きい
  ネットワークのポーリングをさける
  ロケーション サービスの起動と終了を明示
5.保安
 全アプリケーションはサンドボックス内にある
  自身のファイルとプレファレンスのみ使用可
  システム リソースの使用制限
 Keychainなどのサービスが利用可

1-07 User Interface Design for iPhone Application.m4v

ビデオのメモ

iPhone用アプリケーションを考える前に読む注意書きで、プログラマだけでなくマーケティングも見ると良いと思います。

iPhoneの特性
 今までと全く異なる
 マウスとタップは異なる
 テキスト入力を最小限に
 表示するものを厳選(小型スクリーン)
 480 x 320の 有効利用
 マルチタスクでない

iPhoneはシングルタスクで、ユーザが作業中に他のアプリケーションを立ち上げると、その時のアプリケーションは終了し、それまでのデータは失われてしまう。次回に起動したときに同じ状態にしたい場合には、終了時の状態を保存する機構が必要である・・・

・・・と、ここまでは分かったですが、そのためのAPIはどの程度まで提供されているのかは説明されていません。例えば、実メモリの状態をそのままスワップアウトするような機能はあると便利です。

ソリューションの提供
 機能ではなく結果を提供
モバイルであるため、何度も短い時間利用されることを意識したデザインが必要である。

必須の機能のみ
Mac OS XのiPhotoとiPhoneのPhotoを比較して解説しています。同様にそれぞれのMailを比較しています。

使いやすさの設計
仕事の流れを考慮します。データ表示は概要から詳細に移るように設計します。面白いことにiPhoneNSTableViewは縦一列だけです。これは小さな画面で分かりやすく処理させるためで、画面を切り替えて次の一列を表示させることで、複数列の問題を処理しています。

指でタップできる大きさにします。ボタンのサイズは44 pointの四角が最小サイズだそうです。

デザイナが使いたがりそうな、ズームやパンは最小限にするように言っています。見る時間が短時間であるため時間のロスは良くない、と言うことのようです。

情報の入力は最小限にしろと言っています。これはメモ代わりという私の使用目的には合いません。しかし、録音はできたはずなので全く使えないというわけではありません。この意味では文字入力も図を描くことも、録音も写真もできるSony Clieの方が有効です。

一貫性の確保
ボタンなど組込済みのコントロールを利用することで、見た目の一貫性を持たせるように言っています。コントロールは以下のようなものがあります。
 Tool bar
 Navigation bar
 Table view
 Segmented control
 Page indicator
 Picker
 Activity indicator
 Slider
 Button
 Switch
>と丸で囲まれた>の意味は異なるそうです。
 >のみは・・・
  さらにデータがさらにあり、
  欄全体がボタンになっていて、
  押すと次のページに移ります。
 丸で囲まれた>は・・・
  >のみがボタンになっていて、
  押すと詳細が表形式で表示されます。
  色遣いにも注意が必要です。

驚きと喜びを
まあ、これはiPhoneをみれば、わかるでしょう(笑)

Macintosh、Mac OS Xと同様に、iPhoneにもiPhone Human Interface Guidelinesがあるそうです。

1-06 Using iPhone Features in Your Application.m4v

ビデオのメモ

iPhoneのアプリケーションはアドレス帳や写真からデータにアクセスできます。また、Webの内容をアプリケーション内に埋め込むこともできます。
アドレス帳のアクセス方法
既存のデータ利用
 ABPeoplePickerNavigationController
 ABPersonViewController
データ生成
 ABNewPersonViewController
未処理データの扱い
 ABUnknownPersonViewController
データの読み書き
 ABAddressBookCopyPeopleWithName
 ABPersonCopyImageData
 ABPersonCreate
 ABRecordSetValue
注意事項
 CFRetaiとCFReleaseを使用すること
 CopyとCreateを使用したときは必ず解放すること
 Getは自身でメモリを確保していないらしく、解放する必要がないらしい

写真のアクセス方法
iPhoneやiPod touchの写真ライブラリから写真を表示する方法

// 写真ライブラリが空でないことを確認
if ([UIImagePickerController isSourceTypeAvailable:
 UIImagePickerControllerSourceTypePhotoLibrary]) {

 UIImagePickerController *picker;
 picker = [[UIImagePickerController alloc] init];
 picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

 picker.allowsImageEditing = YES;

 picker.delegate = self;

 [currentViewController presentModalViewController:picker animated:YES];
}

カメラは上記のソースを少し変更するだけで利用できます。
// 写真ライブラリが空でないことを確認
if ([UIImagePickerController isSourceTypeAvailable:
 UIImagePickerControllerSourceTypeCamera]) { // Cameraになっています

 UIImagePickerController *picker;
 picker = [[UIImagePickerController alloc] init];
 picker.sourceType = UIImagePickerControllerSourceTypeCamera; // Cameraになっています

 picker.allowsImageEditing = YES;

 picker.delegate = self;

 [currentViewController presentModalViewController:picker animated:YES];
}

写真の編集
元になる関数は以下の通りです。
- (void) imagePickerController:(UIImagePickerController *) picker
     didFinishPickingImage:(UIImage *) imagePickerController
           editingInfo:(NSDictionary *) editingInfo {
// 必要に応じてイメージを処理
 [self saveImage;image];
}

例です。

- (void) imagePickerController:(UIImagePickerController *) picker
     didFinishPickingImage:(UIImage *) image
           editingInfo:(NSDictionary *)editingInfo{

// 元のイメージを入手
 UIImage *origialImage = [editingInfo
           valueForKey:UIImagePickerControllerOriginalImage];

// メタデータとして保存
 [self saveTagZone:[editingInfo
    valueForKey:UIImagePickerControllerCropRect]];
}

Webの内容を入手

// Web viewを生成
 CGRect rect = [[UIScreen mainScreen] appicationFrame];
 UIWebView *webView = [[UIWebView alloc] initWithFrame:rect];

// 電話番号の検出機能を切る
 webView.detectsPhoneNumbers = NO;

// Web viewURLをロード
 NSURL url = [NSURL URLWithString:@"http://foo.com"];
 NSURLRequest *req = [NSURLRequest requestWithURL:url];
 [webView loadRequest:req];

以下の方法でURLを開く感覚で他のアプリケーションを開くこともできると言っています。


 NSURL *url = [NSURL URLWithString:@"http://apple.com"];
 [[UIApplication sharedApplication] openURL:url];

URLに応じて以下のアプリケーションを開くことができると言っています。
 Safari:http://, https://, feed://
 Mail;mailto:
 Google Map:http://maps.google.com/
 You Tube:http://www.youtube.com/
 iTunes:itms://
独自アプリケーション:myapp://

独自アプリケーションをURLで起動できるようにするにはinfo.plistに以下の項目を追加します。
CFBundleURLType      Array
 0            Dictionary
  CFBundleURLName   String My Custom URL
  CFBundleURLSchemes  Array
   0           String myapp
  LSIsAppleDeaultForScheme Boolean Yes

- (BOOL)application:(UIApplication *) application
 handleOpenURL:(NSURL *) uel {
// 送られてきた問い合わせの文字列を入手
 NSString *queryString = [url query];

// 送られてきた文字列から情報を取得...

//キーと値を処理 ...
}

他のiPhoneとの通信
Bonjour
を使用して通信できるとしていますが、消費電力が増大し電池使用時間が短くなる、とも言っています。

1-05 iPhone Graphics and Media Overview.m4v

ビデオのメモ

グラフィック関連ではUIKit Graphics、Quartz 2D、Core Animation、OpenGL ES、Media Player、Core Audioの6つを利用できます。

UIKitのGraphicsは画面切り替えなどのアニメーションも含む2Dのユーザインタフェースを作り、Quartz 2Dは低レベルの2D描画、Core Animationはアプリケーションなどのアニメーション、OpenGL ESはゲーム用、Media Playerは動画再生、Core AudoとOpen ALは音声と役割を担っています。

UIKit Graphicsの主なClassは以下の通りです。
UIImage - イメージデータのクラス
UIImageView - インタフェースにイメージをいれたり、スライドショーのイメージを入れる
UIColor - 装置の色関連
UIFont、UILabel - 文字処理関連
UIScreen - スクリーン関連
他にユーティリティ関数がある。

低レベルのグラフィック処理を担当するQuartz 2Dでは、点や線、曲線、四角などはCGPathRefで扱い、四角の塗りつぶしはCGGradientRef、CGImageRefはPNGを中心にしてTIFF、JPEG、GIF、BMP、ICO、CUR、XBMを扱い、CGPDFDocumentRefはPDFを扱っています。

Core Graphicsで緑の枠に青い四角を描く描画サンプルです。
- (void) drawRect:(CGRect)rect
{
 CGContextRef myContext = UICurrentContext();

 CGRect ourRect = CGRectMake(40, 40, 240, 120);

 CGContextSetRGBStrokeColor(context, 0.0, 0.0, 1.0, 1.0);
 CGContextFillRect(context, ourRect);

 CGContextSetRGBStrokeColor(context, 0.0, 1.0, 0.0, 1.0);
 CGContextStrokeRectWithWidth(context, ourRect, 10);
}

Core Animationはユーザインタフェースのアニメーションを提供しています。レイヤをサポートしており、一つのレイヤに写真を置き、その上に文字のレイヤを置き、さらに絵のレイヤを置くことができます。また、レイヤを半透明にしたり、フェイドインアウトでレイヤを入れ替えることもできます。

Core AnimationのレイヤではCALayerが主のクラスとなり、CAEAGLLayre、CATiledLayer、CAScrollLayerがあります。また、アニメーションのクラスではCAAnimationが主のクラスとなり、CAPropertyAnimation、CABasicAnimation、CAKeyframeAnimationがあります。CAAnimationの下にはCAPropertyAnimationの他に、CATransitionとCAAnimationGroupがあります。

OpenGL ESはOpenGLの機能制限版でiPhoneで採用しているのはバージョン1.1です。詳細は以下のURLを参照してください。

http://www.khronos.org/opengles/

Media Player Frameworkの動画はフルスクリーンのみで、.mov、.mp4、.m4v、.3gpの再生ができます。

動画の生成と制御
- (id) initWithContentURL:(NSURL *)url;
- (
void) play;
- (
void) stop;

プロパティ
@property MPMovieScalingMode scalingMode;
@property BOOL userCanShowTransportControls;

ノティフィケイション
NSString * const MPMoviePlayerScalingModeDidChangeNotification;
NSString *
const MPMoviePlayerPlaybackDidFinishNotification;

MPMoviePlayerCotrollerの例

- (void) playMovieAtURL: (NSURL *)theURL
{
 MPMoviePlayerCotroller *theMovie = [[MPMoviePlayerCotroller alloc] initWithContentURL:theURL];
 theMovie.userCanShowTransportControls = NO; default

 [[NSNotificationCenter defaultCenter] addObserver:self
          selector:@selsector(myMovieFinishedCallbask:)
            name:MPMoviePlayerPlaybackDidFinishNotification
           object:theMovie];
 [theMovie.play];
}

- (
void) myMovieFinishedCallbask:(NSNotification*) aNotificaition
{
// remove the observer, release the MPMoviePlayerController
}

1-04 iPhone Application Frameworks - In Depth.m4v

ビデオのメモ

1-01と似たアーキテクチャのレイヤを解説しています。その後にMac OS XのCocoaとiPhoneのCocoa Touchを比較していて、Foundationは同じとして、AppKitとUIKitの違いに重点をおいています。UIViewの下にUIWindowとUIControlが配置されています。UIWindow、UIView、UIViewControllerの説明が続きます。UIViewControllerはviewを呼び出すだけでなく、メモリ不足の警告も出すようです。UIViewControllerの一つとしてUINavigationControllerをアドレス帳を例にソースコードと画面の動きを見せながら解説しています。各画面をスタックにプッシュしながらデータの詳細に移動し、再度データの概要 を見るときにはスタックからポップしています。

次にStatus Barの下にUIWindowでウィンドウを生成し、図 UIImageViewやデータ UITableView、ツールバー UITullbarControllerなどの部品を配置する方法を解説しています。

画面の構成の後は、EventとGesturesの処理が続きます。GesturesのUITouchSwipedRightは興味深いです。

「UIKitのControlとView」ではUIPickerというユーザインタフェースが紹介されています。UITableViewは一つの列だけを扱い、他の列を表すときには右にスライドするアニメーションを利用します。

1-03 iPhone Application Development - Getting Started.m4v

ビデオのメモ

このビデオ シリーズではiPhoneのFrameworkをCocoa Touchと読んでいますが、どうもこのCocoa Touchは「ここ タッチ」に聞こえます(笑)

最初の部分は今までのビデオの解説と重複していて、次にObjective-C、View Controller Modelの解説が続きます。

Cocoa Touch命名省略ルールは以下の通りです。
iPhoneの"UIImageView"を例にすると
"UI" - UIKit frameworkの一部
"Image" - UIImageと共に機能
"View" - UIViewのサブクラス

UIImageViewはpropertieとaccessorメソッドを採用
Getter: animationImages
Setter: setAnimationImages

Delegation、Categories、Subclassの解説が続き、ようやくCocoa TouchのUIKitの解説が始まります。iPhoneのUIKitはMac OS XのAppKitにあたるそうです。UIKitには色々なframework(ツール)が含まれていて、ビデオではそのツール次々と列挙されます。

2008年6月12日木曜日

1-02 iPhone Development Tools Overview.m4v

ビデオのメモ

Xcodeの解説です。1-01のプロジェクト作成がデモンストレーションされます。iPhone関連のプロジェクトはCocoa Touchの名前で呼ばれているようです。

Organizerでプロジェクト管理やiPhoneへのダウンロードなどを行う。コンソールやクラッシュログ、スクリーンショットなども提供されている。

次はXcodeがもつコーディング部分の解説です。コード管理ツールShapshotsやSCMの解説もしています。最新版ではさらに便利なっているようです。また、APIの解説が表示されるResearch Assistantも紹介されています。

Interface Builderは"COMING SOON"になっています(笑)

ビルドのデバッグでは、デバッグ情報が吹き出しがポップアップします。iPhoneシミュレータとデバッガを同期させてデバッグできます。ポップアップメニューでシミュレータとiPhoneを切り替えて検証できます。

パフォーマンス解析ツールとしてInstrumentsが提供されていて、Xcodeと連携して動作します。メモリやプロセッサの占有度をグラフィカルに表示します。Runメニューの"Start with Performance ToolからActivity MonitorやCPU Sampler、File Activity、Leaksなどを選択できます。

1-01 Introduction to the iPhone SDK.m4v

今日からメモを取りながら解説の動画見ることにしました。

まずは、iPhone SDKに入っているツールの紹介です。

Xcode 言わずとしれたMac OS XのIDE
Instruments リアルタイムでメモリやプロセッサのモニタ
Dashcode Webのユーザインタフェース構築ツール
Simulator iPhoneのシミュレータ

XcodeでCoco Touch Listテンプレートを使ったデモンストレーションをしています。ただし、ここで表示されているリストの内容はβ6では消えていました。New Projectの画面デザインも変わっています。

次にアーキテクチャの解説でCore OS、Core Services、Media、Cocoa Touchの各レイヤが解説されます。

Core OSではLibSystem library、
Core ServicesではCore foundation frameworkとCFNetwork framework、Security framework、SQLite library、XML libraries、
Mediaではグラフィック技術としてQuartz、Core Animation、OpenGL ESがあり、音声技術ではCore AudioとAudio ToolBox frameworks、OpenALがる。さらに動画技術ではMediaPlayer frameworkがある。
Cocoa TouchではUIKit frameworkがある。UIKitはアプリケーション間通信、グラフィックスとウィンド サービス、タッチなどのイベント処理、ボタンなのパーツ、Webとテキスト処理、加速検出のデータ処理、カメラ処理、写真ライブラリ処理、装置のID提供しています。さらに、Addressbook frameworkとAddressbook UI framework、場所情報を入手するCore Location frameworkも提供しています。