ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

目指せ!iPhoneアプリ開発で起業コミュのアプリを作るにはどうすればいいんだろう

  • mixiチェック
  • このエントリーをはてなブックマークに追加
管理人さん不在なので、勝手にトピックを作ってしまって良いのかどうかわかりませんが、
参加されている方の中に、何か作り始めている人もいらっしゃるみたいですので、
どれだけ技術情報が共有できるかも含めてトピックを作らせてもらいました。
興味のある人は読んだり書き込んだりして頂けるとうれしいです^^。
(もし、まずかったら言ってください>管理人さん)

「こういうことはブログでも作って勝手に作れよ」と言われる方もいるかもしれませんね。
その場合は指摘してください。書き込みは削除しますので。迷惑をかけようと思っている訳
ではありませんので^^;。

私も知ってる範囲が狭いので、あまり書き込みできないかもしれません。
それに、皆さんも既に知っている事も書いてしまうかもしれませんので、そこは許して
ください。
どういった方を対象に話し始めるかを考えると、いろいろ考えないといけないので
まずはおきまりの
1) 何を用意したら作り始められるんだろ
2) なにから始めればいいんだろ
3) 作り始めたけど、どうやって記述するといいんだろ
という点から書くのが定番かなと思いますので、そこから。
(そんなの知ってるわ!って人は無視しておいてください^^;;)

1) <何を用意したら>
 まずはハードウェアの話。
 ま、パソコン用意しろって事ですね。さすがにiPhoneだけ有っても作れません。
 まあ、ここに参加されている方は、おそらくみんなパソコン使って書き込みされている
 のじゃないかと思いますので、私がどうこう言うまでもないかと^^;。
 知らない人の為に書きますと、iPhone用のアプリを作る場合は、マックを使うしか
 ありません。ウィンドウズのPCじゃだめなんですよね。まあ・・アップルの陰謀でしょう。
 しかも、マックでも色々種類があるので、Intel製CPUで動作しているマックじゃないと
 だめだったと思います。
 最近マックを買った人なら大丈夫ってことでしょうね。
 余談ですが私はiPhone3Gが出る半年くらい前にマカーになったのでギリギリIntelチップセットの
 iMacです(だからスピードおっせーT_T)。
 皆さんは、どれくらいのスペック(性能)のマックを使用されていますか?
 たぶん、私が普通に使って作成していても問題はないくらいなので、Intelチップセットのマック
 を利用されている人は大丈夫なんじゃないかなと。

 まあ・・・・釈迦に説法でしょうが、ネットにつながっている環境は必須です。
 作り始めたらネットにつながっていなくても問題はないんですけど、まずは後で書く作成用ソフト
 をネットでダウンロードしないといけないので。
 っていうか、ここに書き込んでいる皆さんですから、その環境はありますよね(汗。
 ネット環境が必要と思うもう1つの理由は、参考文献を調べることが多いってことがあるからです。
 ま、これは人によって頻度も異なりますし、絶対必要ということではないでしょうね。

 ソフトの話をする前に、
 「はじめまして」のトピックに参加されている方も言われているように、「まずはマックの
 操作には慣れておかないと」ってことがありますよね。たしかに慣れていると何かと便利だし
 さささっと行動できるので作業もはかどるとは思います。
 これは人それぞれだと思うのですが、私の経験では、マックの操作とかは「アプリを作りながら」
 慣れていきました。というか、「慣れる」ってのは何か目的があったほうがしやすいのかなと
 思うのですよね。だったら「つくってみたい」って思いがあるわけだし、それを目標として
 マックにも慣れてみるのもアリかなというのが動機です。
 かれこれ2年弱くらいになりますが、もう慣れました。もちろん、必死になんてなっていません。
 やっぱり楽しみながらが1番なのかなと思います。苦痛に感じるようであれば、おそらくアプリも
 作り終わることはできないのじゃないかと思います。
 最初は誰もが「わからない」はずです。でも、きっかけだと思うのですよ。そのきっかけに
 出会うチャンスを得た人は「わからない」が「わかってきた」に変わりますし、「わかってきた」
 は「おもしろくなってきた」に変わるのではないかと思います。
 たぶん、その「おもしろくなってきた」は「思う事が表現できるようになってきた」に変わって
 「表現はできるけど、もっとおもしろくしたい」と変わり、「どうすれば実現できるのか=自分の
 ものにする」という点で悩み始めるのだと思うんです。
 この悩みは苦しみじゃなく快感なのじゃないかなと私は思ってます。(いや、快感っていっても
 変な意味じゃないですよ・・・・^^;)

 つづきます

 

コメント(31)

 ハードの話は・・・これだけです。
 あとはいらないんですよね。だから個人でもお手軽に始められる。
 これがiPhoneアプリ作成者が増えた要因の1つなのかもしれません。
 
 余談ですが、ウィンドウズのアプリを作る場合も、無料の制作環境を手に入れたり
 できるようですけど、それなりに性能の良いPCを使わないと困るはずです。
 無料はいいんだけど、そのソフトをダウンロードなりで手に入れてインストールしたは
 いいけど、作成していくと「すごくひきつる」なんてのはよく経験しました。
 まあ、そういうのを作ろうと思っている人達にはぜひ他のコミュなどでがんばって
 頂きましょう(笑。我々は、iPhone(iPad)で動くソフトを作ることが前提なので
 上述したマック環境であれば、よほど困ることはないと思います。

 さて、ソフトの話。

 まあ、iPhoneアプリを作るのが前提ですので、SDKってソフトが必要になります。
 S:software D:development K:kitだったかな。忘れた。
 ようは、ソフト開発ツールです。
 で、SDKってソフトがあるのではなく、SDKというツール集があって、その中に
 「Xcode」「デバッガー」「Interface Builder」なんてのが入っています。
 このSDKはアップルが用意したiPhone dev centerってサイトからダウンロードできます。
 もちろん無料。

 なんですけど・・。これを用意する為には、
 A) まずはApple IDが必要
    まあ、iPhoneをお使いの皆さんなら既にお持ちでしょう。
 B) iPhone dev center(デベロッパーセンター)のサイトは
   http://developer.apple.com/iphone/index.action
  です。英語です。まあ・・・英語ですけど、そんな悩むほどではないです。
  ここでApple IDでログインしないといけないんですけど、初めての人は、自分が
  アプリを作る開発者になりたいと宣言する為に、設問に答えていかねばなりません。
  まあ・・・英語で書いて聞いてきますが、難しくないのでトライしましょう。
  で、この質問の最後の辺で「どういうアプリを作るつもりなの?」と英語で聞いて
  きます。たぶん、初めての人はここで躊躇するのだと思うんですよね。
  「え?作れるかどうかもわからないのに、何を作るか宣言しないといけないの?」って。
  まあ、きにしないで大丈夫です。別に完成させる保証は必要ありませんので。
  最初ですから気軽に「ま、試してみるかぁ〜」程度に考えて好きな種類を選択しましょう。
  ここで宣言したとして、違う種類のアプリ作ったって問題ありませんので。

  で、この手続きをすればやっとSDKをダウンロードするリンクが出ると思います。
  (私も最初どうやったかうろ覚えなので、すいません。だいぶ前なので今は少し違う
  かもしれません。まあ、手続きは1回だけなので、次からはSDKのダウンロードページ
  がすぐに出てくれるわけですよ)。

  ちなみに、SDKのサイズは2〜3GBくらいあります。ダウンロード時間はお気をつけて。

 DLが終わったら、インストールです。これは・・・細かく書いていると大変なので、
 皆さんもがんばってみてください(まあ、アプリ作ろうってくらいですから大丈夫)。

 ちょっと余談なんですけど、
 iPhone実機をマックにつないで、実機に自分の作成したプログラムを流し込むのは
 もう少し先の話にさせてください。やり方はわかるんですが、手続きが結構ありますので。

2)<何から作れば> に続きます
途中でメッセージをはさんで頂いてOKなので、
質問や意見などあれば書いてくださいね

2)以降はまた明日にでも書きますね
2) <何から作ればいいんだろ>

開発ツールの話をもう少しだけ続き。
インストールが完了したら、そのSDKのうち、Xcodeが開発の基準環境(まあ、窓口みたいなもの)
になるので、それを起動しやすいようにショートカット(エイリアス)を作るのですが、
普通はエイリアスを作る場合は
Finder → Finderの窓の左の「場所」にある「アプリケーション」 
って目的のソフトの起動アイコンを探して、ドラッグしたりするんだと思うんです。

ところが、このSDKって、このやりかただと出てこないんですよね。
どこにあるかっていうと、
Finder → Macintosh HD(人によって名前は違うと思います。ようはそのPCのドライブ)
→ Developer → Applications
とフォルダを追うと出てきます。
この中にXcodeやInteface Builderなどのアイコンがあるのでエイリアスを作ってしまい
ましょう。
(私の環境ではこうなっているのですが、皆さんのPCの環境では違うかもしれません。
その場合はお許しを・・^^;)
(余談)どうでもいいことなんですが、私は基本的にDockを画面上に表示していますので
そこにショートカットを作成しています。上記のような場合にエイリアスを作る時は、その
アイコンを直接Dockにドラッグしてやれば自動でエイリアスを作ってくれます。
もちろん、手作業で作ることもできますけどね)

ここで気になるのが、「じゃあ、どのソフトのアイコンをドラッグしておいたらいいの?」
という点なんですが、これは人によってさまざまです。
A)Xcodeはプログラムを作成(記述)する場合に必ず利用しますので、Xcodeのエイリアスは
どなたも必要でしょう。
B)Interface Builder。これはいってみれば「プログラム作成支援ソフト」でしょう。
ようは、画面に(アップルが用意してくれた)パーツが出ているので、これをドラッグして並べたり、
そこに設定を書き込んだりして、Xcodeで難しそうなプログラム記述しなくても自動で
「ある程度は」プログラムを生成してくれるツールです。
このコミュで既に作り始めている人の中にはInterfaceBuilderを利用しながら作成され
ている人もいらっしゃるかもしれません。
ちなみに・・・・私は、これ一切使っていません^^;;。
いや、便利なんだと思うんですよ。色々パーツも用意されているし、バグも少なくて済む
かもしれないかなとは思うんです。開発する上で、開発効率を上げる意味では効果の
あるツールなんだと思いますが、私は・・・好きません(笑。
皆さんは、必要であれば利用されれば良いかもしれませんね。
C)QuartzComposer。
すいません。使ったことないんです^^;。調べたことすらありません。
たぶん、iOS(iPhoneのOS)に含まれるQuartz2Dなどの機能を利用したプログラムを作る場合に
利用できる(しなくても問題はない)のだとは思いますが、興味のある人は是非調べて、この場で
教えてください。

あとは・・・・いらないかな(笑。
基本的に使うツールは、Xcode、InterfaceBuilderと、iPhoneシミュレータです。
iPhoneシミュレータとは、Xcodeで記述したプログラムをPC画面でシミュレートして
くれるツールです。
これはエイリアス作らなくても、Xcodeから自動で起動してくれます。
(もちろんエイリアス作っても構いませんけど。たしか場所は、さっきのフォルダの中の
Developer → Platforms → iPhoneSimulator.platform → Developer
→ Applications
だったと思います。)

今、SDKをダウンロードされた人は、おそらくiOS4を基準にしたSDKのバージョンに
なっていると思います。
まあ、色々機能はあるのでしょうが、私はほとんど使っていません。というか使う必要が
ないんですよね。今でもOS2.0程度までの機能しか使ってない状態でプログラムして
いるくらいです^^;。

なにかと前提ばかりを話してきましたので、正直おもしろくない話だったと思います。
(まあ、この先もおもしろいとはいえませんが・・・^^;;;;)

次はいよいよ本題で「何から作れば」を具体的に書いてみますね。
では本題。

よく事例のサイトや書籍に書かれる、まず最初のサンプルに「Hello World」があります。
ようは、「Hello World」という文字列をiPhoneの画面に表示してみましょうというプログラム
です。
まあ・・・・こういうのは基本を知る意味では良い手段だとは思うのですけど、
こんなの・・・・楽しいです?
たぶんね、こういう方法から開始するとプログラムって楽しくないと思うんです。
それより、もっとハデな事をやってみましょう。

プログラムの仕組みを覚えることよりも、何が、どう実現できるのかを、目でみて
「おお、動いたじゃ〜〜〜ん」って思うほうが楽しさがあると思うんです。
なので、いきなりですけど、iPhoneの画面に画像を表示して、その画像をぐぐっと
拡大してみるプログラムを作ってみましょう。
どうやってこう動くのかは、あとで説明しますので。

まずは、プログラムを記述するうんぬんよりも、
Xcodeを使わないといけないという事が前提となりますので、これを知りましょう。
さっき作ったXcodeのショートカットを使って、まずはXcodeを起動です。

たぶん・・・画面上にXcode、ファイル、編集・・・・などと書かれたバーが出て、
画面中央に「Welcome to Xcode」って書かれた窓が出ているんじゃないでしょうかね。
(出ていなくても問題はないですけど)。
この窓は、まあ解る人には解るでしょうが、前回作成したファイルをすばやく再度開く
為のうながしですので、興味のない人は消せばいい(キャンセル)と思います。

まずは、
ファイル → 新規プロジェクト
とクリックしましょう。
プロジェクトってのが、1つのアプリと思ってもらえればいいと思います。

で、新規プロジェクトという窓が表示されるので、
その中の左側に「iPhoneOS」と書かれた直下に「Application」と出ているので、
ここをクリックします(というか、最初はここがクリックされた状態になっています)。
この場合に、窓内右側に7個のアイコンが表示されています。
A) Navigation-based Application
B) OpenGL ES Application
C) Split View-based Application
D) Tab Bar Application
E) Utility Application
F) View-based Application
G) Window-based Application

これらは、ようはテンプレート(ひながた)です。どれかを選択すると、その様式に
あわせたプログラムを事前に用意してくれます。
まあ、どれを選ぶのかは、作ろうと思うアプリ次第だとは思います。
色々種類があるので、1つづつ説明しだすと大変なので、これは興味が
あれば1つづつ作ってみてください。
ちなみに、私はG)以外使ったことがありません^^;;;;。G)は無地状態なんです。
最低限度のひながたのプログラム記述は用意されていますが、とにかく1から記述
する方式です。
なぜこういう方法を使うのかというと、色々調べていくうちに、結局は色々知る事
になるので、それを具体的にプログラム記述するにはどうすればいいかを考えると
結局無地環境で1から理解していかねばならないようになってしまいました。
これは私が、何も無い状況から開始したから、が理由なので、私と同じ道を
たどる必要はありませんので誤解のないようお願いしますね^^;。

申し訳ないですけど、今回の事例説明はG)を選択した事を前提で書かせてもらいますね。
そのほうが1つ1つ理解していくと思いますので。

で、この7つのアイコンを選択する場所の下に「Product」と書かれた欄があります。
「iPhone」「iPad」「Universal」と選択できるのですが、Universalってのは使ったこと
ないです。ま、お好きなのを選んでどうぞ。

ひととおり決めたら「選択」をクリックです。

すると、プロジェクトの名前(アプリの名前=フォルダの名前になります)を聞いてくるので
すきなように名前を入れてください。
(そのアプリに含まれるファイルはこのフォルダに入るわけです。どの場所にフォルダを作成
するかは自由です。まあ・・・書類の中でも作っておけばいいかと。)
決めたら「保存」をクリック。

これで、やっとプログラムを記述する手前まで着ました。
少し注意点があるので、次の書き込みで説明します。
例えば、先程のプロジェクト名を「ap1」とつけたとしますね。

すると、今表示されている窓には「ap1」とタイトルがついていると思います。
その窓の中は3分割されて表示されていて、
「グループとファイル」「ファイル名」と無地の欄が出ていると思います。

この”欄”を説明する前に、注意。
「ap1」の窓の左上に「Simulator-0.0 | Debug | ・・・」と出ていればOKです。
「Device-0.0 | Debug | ・・・」となっていれば、「Simulator」を選択しておいて
ください。
(何を言ってるのかというと、ここの指定で「iPhone実機で動かす」か「画面で
シミュレートしてみる」のかを選ぶという事なのです。まずは画面で見ましょう)。

では続き。
<グループとファイル>
まあ、いろいろなファイルを管理するために、自動で用意されているフォルダが
表示されています。
ここは重要なので、少し説明しておきます。

基本的に利用するフォルダは、
「Classes」と「Resources」と「Frameworks」と思ってもらえればよいと思います。
「Frameworks」はほとんど使いません(いずれ意味が解ってくれば使いますので)。
説明のほとんどが「Classes」フォルダに関してなので、先に「Resources」フォルダ
を説明しておきますと、
リソースという名のとおり、ここには”プログラム中で利用する色んなデータ”をここに
保管しておくという事になります。
?よくわかんねーってなると思うので、1つの例で言えば、
今回の事例は「画面に表示した『画像』を拡大してみる」というテーマなので、
この画像のデータ(ファイル)をここに保管(設置)しておきなさいよという意味
なのです。

画像を用意しておきました。(期待はしないように^^;)
このコメントに貼り付けてありますので、試してみる人は利用してみてください。
ちなみに、画像ファイルにも色々形式があると思います。
.gifや.jpgや.pngといったものがありますが、iPhoneで利用する場合は
pngがよいでしょう。(制約があるのかもしれないけど、私は今までこの形式
しか使ったことがありません)。

このサンプルを使う場合は、好きな場所にファイルとして保存しておいてください。
自分で用意した画像を使う場合は、その場所を覚えておいてくださいね。

で、話を戻しますが、
先程の「ap1」という窓の「Resources」というフォルダの上で”右クリック”して
ください。
するとメニューが出るので、「追加」をフォーカスするとサブメニューが表示されます。
ここで「既存のファイル」を選択(クリック)してください。
※なぜ「既存の」を選ぶのかというと、既に用意された画像(サンプル)を利用する
 からです。
 ちなみに、ここに貼り付けたサンプル画像のファイル名は「sample1.png」です。
 (って、書き込んでから気がつきましたがmixiってjpgしかアップロード受け付けない
 んですね。ばっかじゃねーのか。しかたないのでjpg状態で貼り付けておきます。
 pngに変換は皆さん側で行ってみてください。もしくはご自身で何かpngを用意して
 くださいね。ちなみに私はフォトショップとか使っています)

すると、「そのファイルはどこにあるの?」とばかりに、場所を聞いてくる(窓が開く)
ので、該当するファイル(この事例ではsample1.png)を探して「追加」をクリック
しましょう。

すると、「デスティネーショングループのフォルダに項目をコピーする場合」と書かれた
横にチェックする欄が出ます。
つまり、このsample1.pngが「ap1」というフォルダ以外の場所にあるのなら、
「ap1」の中に複製しておきますか?という意味なのです。
コピーしておいたほうが良いと思うならチェックマークを入れておきましょう。

まあ、ややこしいし、なんでもいいやって思う人は、チェック入れておいて大丈夫
です。あとで段々意味わかってくると思いますので。

その窓の下部に色々書いてありますが、無視していいです^^;。
「追加」をクリックしましょう。

すると、「ap1」の窓が再度出て、その「Resources」フォルダが選択された状態で
「ファイル名」という欄に「sample1.png」というファイル名が追加されます。

ここでやっていることを要約すると、
「画像ファイルをプログラムで使いたいから、そのファイルをap1に所属させます。
その為に、Resourcesというフォルダに登録しておきます」
という設定をXcodeに教えたわけです。

この事例では、こういった画像ファイルを利用しているのでResourcesを利用
していますが、アプリによってはリソースは不要の場合もありますので、あしからず。

では次こそ、プログラムを記述していきましょう。
先程から見ている「ap1」という窓の
<グループとファイル>
の中に「Classes」というフォルダがあると思います。
ここにプログラムを記述する為のファイルが入ります。
今の状態では、Xcodeが用意してくれているファイルが2つあります。
「ap1AppDelegate.h」と「ap1AppDelegate.m」
まあよく「デリゲート」呼ばれるんですけど、意味は「代表」って感じですかね。
正直、私も中身よくわかってないんですよ(笑。

とにかく覚えておくべきことは、
このアプリ(ap1)を起動した場合は、まず「このデリゲートから始まる」という事。
で、ややこしいことは無視して、
「このデリゲートのプログラムに追加して、ちょっと記述しておくだけで、他のプログラム
を呼び出せる」ので「実際に動かすプログラムの記述は、自分で作った新しいファイル
に記述しておいて、それをデリゲートから呼び出すようにしておく」
という仕組みを利用するということを理解だけしておいてほしいのです。

まあ、ようは、自動的に生成されたデリゲートってファイルは、少しだけは変更記述する
んだけど、それだけすればデリゲートってファイルはいじらない、と思っておいてもらえれば
良いということです。

ま、それは頭の片隅に置いておいて頂いて、
先に理解しておかねばならない事があります。
さっき「Classes」には2つのファイルがあるといいましたけど、名前は同じですよね。
だけど、拡張子だけが異なる。「.h」と「.m」ってなっています。
「.h」ってのはヘッダファイルと呼ばれます。「.m」ってのが通常よく使うファイルなんですけど
(プログラムを記述していくファイルですね)、なんでmって拡張子なのかは私は知りません。
そんなこと興味なくても作れるってことです^^;。
この決まりは、たぶん、iPhoneアプリを作る上で必ず利用するObjective-Cというプログラムの
構文がこう決まっているからなのだろうと思いますが、これも覚えるだけの事であって、私には
興味のない事です。興味のある人はぜひObjective-Cを研究して、このトピックで教えて
ください(笑。
このトピックでは必要最低限のObjective-Cについても話してみようと思います。
じゃないと、いまいち理解しにくいと思いますので。
ただ・・・私、Objective-Cって全部を理解していないんですよね^^;;;;;。
2年経った今でも、中途半端に理解した部分だけでプログラミングしています。
いやあ、それでも動いているんだからとんでもない話ですよ(笑。
ま、私も発展途上であるってことで許しておいてください。この場を借りて、勉強はしてみたいと
思ってはいますので。

で、続き。
2つのファイル(.hや.m)がありますけど、実際には1つに合成されているんですよね。
まあ、そんなのは機械がやってくれることなので、我々は無視しておきましょう。
とにかく、すべきことは、こういった2つのファイルを理解していくということです。
ややこしい話は置いておいて、
まずは自分でプログラムを組む為のファイルを作りましょう。
そのために、「Classes」に新規のファイルを作成します。
(先に言っておきますが、新規のファイルを作成すると、先程と同じで、新規の.hと.mの2つが
作成されることになります。が、自動でされることなので「なぜ?」とかは考えないようにしましょう)。

続きます
「Classes」のフォルダの上で”右クリック”するとメニューが出るので「追加」をフォーカスします。
(さっきの「Resources」と同じような操作ですが・・・・・ここから少し違います)。
ここでは新規にファイルを作成するので、「新規ファイル」を選びます。
<新規ファイルのテンプレートを選択>って窓が出ます。
窓の左上に「iPhoneOS」と出ている下欄に「Cocoa Touch Class」と出ていて、それが選択
されているはずです。このメニュー(Cocoa・・)の場合は、右側に4つのアイコンが並んでいます。
A) Objective-C class
B) Objective-C protocol
C) Objective-C test case class
D) UIViewController
まあ・・・・色々覚えることはあるんですけど、とにかくA)を使うという事を覚えましょう(笑。
「classってなんじゃ!」ってなるでしょうけど、いずれじわじわと解るでしょうし、そんなことを
知るよりも、何を作るかという事の方が重要でしょ?
なので、全部を理解することよりも、まずどこから知るべきかだと思います。
このアイコンは「Objective-C class」を選択。

で、その下の「Subclass of」となっているところを「UIView」を選びます。
「次へ」をクリックすると、ファイル名を聞かれるので、好きな名前をつけましょう。
っていうか、この事例では「kakudai」とでもしておきましょうか。
画像を拡大するプログラムを書くわけだしね。
つまりファイル名:「kakudai」.m となります。
これで、kakudai.h と kakudai.m が生成されているはずです。

操作としては、そんなに多くの工程じゃないんですけど、文章で書くと
結構長いもんですねぇ〜〜^^;;。
読むのも大変じゃないですか?申し訳ないです。

やっと中身の話に入りましょう。
kakudai.hの中身を見てみましょう。

//
// kakudai.h
// ap1
//
// Created by 作成者名 on 10/7/29.
// Copyright 2010 ○○○ All rights reserved.
//

#import <UIKit/UIKit.h>

@interface kakudai : UIView {

}

@end

となっていますね。
行の最初に「 // 」となっているものは、コメント文です。プログラムでは何も影響
しません。
まあ、C言語準拠のObjective-Cの構文なので、覚えるだけの話です。
1行文のコメントは、行先頭に「//」をつけるだけ。
複数行にまたがるコメントは「 /* 」で始まり、「 */ 」で終わらせるようにします。
例えば、
/*
* ここはコメントです
* ここもコメントです
*/
って感じです。途中の行は先頭に*を入れておきましょう。

#importはあとで説明します。

この説明での中核は、ここからです。

Objective-Cは、
A) @interfaceで始まって@endで終わるブロック ←これが.hファイルに設定されている
B) @implementationで始まって@@endで終わるブロック ←これが.mファイルに設定されている
という構成が基本になっているようです。

過去にC言語やC++などの言語でプログラムを作ったことがある人は、@interfaceってのがクラス宣言で
@implementationがメソッド群になっていると理解すればわかりやすいかもしれません。
知らない人は、まあ・・・なんだかよくわかんないけど、とりあえず話を進めてみるかと思ってください。

で、さっきの@interfaceの話。
上に書いたプログラムの@interfaceの部分をみてもらうと、

@interface kakudai : UIView {

ってのがありますね。このファイルの名前と同じです。まあ、そう指定したので、自動でそう表記されています。
なんでそうなるの?と考えるのはよしましょう。そこは重要ではないと思います。
UIViewってのが何なのかは、すこし後の話にします。
この文の後に「 { 」がありますね。そして、その少し後の行に逆の「 } 」があって、くくられています。
私も文章表現がうまくないので、どう説明すればいいかわかりませんが、
要約すると、「kakudaiってプログラムは { から } の間に書かれている」ということです。

で、あまり@interfaceのところで悩みたくないんですよ。ここ、そんなに重要じゃないので(笑。
実際にプログラムを記述するのが多いのは、@implementationの方なので、そっち(.mファイル)の話をします。

.hファイルと同じように、最初にコメントが並んでいますので、そこは省略しますね。

#import "kakudai.h"

@implementation kakudai ←ここには { はありません。

-(id)initWithFrame : (CGRect)frame {
if (( self = [ super initWithFrame : frame ] )) {
// Initialization code
}
return self;
}

/*
// うんたらかんたら・・・・・・
*/

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

@end

なんだかさぱーりわかりません(笑。
この@implementation から @endまでの間に、
「 -( ) { ・・・・・  } 」
となって分離している箇所が何個かありますね。
この1つ1つがプログラムなんです。

今、上に書かれている構文がどういう意味なのか、とか、何がどうなるんだ?とかを
考える必要はありません。
まあ、最初はこういう風に「勝手に書かれた状態から、自分で追記していくものなのだ」とだけ
理解してくださいな。

じゃあ、どこを追記していけばいいの?というのが気になる点だと思います。
それを次で説明していきますね。


-(id)initWithFrame : (CGRect)frame { ・・・・・}
ってところがありましたよね?

このプログラムは、まず最初にここを通過します。
init って書いてあるくらいですから、初期(最初)ってことなんでしょう。
この{ }の間に既に色々書かれていますが、これはいじることなく、
その途中にも{ }がありますよね。
if ・・・・・{ } ってところです。
この{ }の中には何もないと思います(まあ、コメント文はありますが)。
ここに、プログラムを記述していくのです。

さっき言ったように、プログラムは最初にinit・・・・を通過するので、
その中に自分のしたいことを書けばよいのです。

で、こんな、既に色々書いてある間に、自分の文を書き込むと
わかりにくくありませんか?
いい方法があるんです。

どこか見やすいところに、別の{ }を作って、それに名前をつけておきます。
この名前は好きにつけれます。
それをさきほどの「if ・・・・{ ここで呼び出す }」で呼び出しをかける方法です。
言葉じゃわかりにくいので、書いてみましょう。

@implementation kakudai  ←ここは元のまま

-(id)initWithFrame : (CGRect)frame {
if (( self = [ super initWithFrame : frame ] )) {
// Initialization code
[self myProgram]; ←ここで呼び出す
}
return self;
}
・・・・・・

-(void)myProgram{
←ここは好きに書いてよいのです
}

@end

ちょっと解りにくいですかね^^;;;;。
ようするに、myProgram { } ってのを@interfaceから@endのどこかすきなところに作ったのです。
で、それを initWith・・・・{ }の途中で呼び出すために、 [ self myProgram ];という構文を入れた
わけです。
こうすれば、myProgramの{ }の中身に好きに書けばいいので、見やすくはなるということです。
※あまり細かく覚えることは無いのですが、せっかくなので少しだけ説明すると、
 [ self myProgram ]; というのは、([ ]は置いておいて) self は「myProgramと同じくくりの
 @interface内にある」という事を指しているのです。
 (まあ・・・正確にいうとinitWith・・・と同じ@interfaceにあるmyProgramを呼び出すという意味なので
  自分自身=selfの中から他を呼び出す)。

 あー文章ヘタだなぁ^^;;。
 みなさんって、服やズボンや靴を着ていますよね?ここでいうselfってのは体だと思ってください。
 でその体に-( )プログラム名{ } という服やズボンや靴があると思ってください。
 靴がヒモ靴だったとしますよね?右足も左足も同じようにヒモでむすんでいますよね。
 右足用と左足用は形が違うけど、使われているヒモって同じものですよね。
 だから、
 -(id) 右足靴 {
      [self ヒモ];
}

-(id) 左足靴 {
      [self ヒモ];
 }

 -(void) ヒモ {
      //ヒモで〜す
 }

なんて感じにヒモ{ }を何度も利用する事も出来るんですよ。
まあ、何度も利用するかどうかは別として、ヒモはヒモだけで管理して監視しておきたいじゃないですか。
なので、
 -(id) 右足靴 {
       //ヒモで〜す
}

-(id) 左足靴 {
       //ヒモで〜す
 }
という書き方から分離させたということなのです。

あぁ〜、こういう講釈ばかりだから、わかりにくいんだろうなぁ・・・。
やっぱり、実際に試してもらうように次で説明しなおししておきましょう。
ややこしいことは抜きにして、まず、全部のプログラムをここに書き出してみましょう。
ここでいう全部とは、最初に説明したデリゲートのファイルも変更が必要なので全部と表現しています。

直すのは、
ap1AppDelegate.h
ap1AppDelegate.m
kakudai.h
kakudai.m
です。

※もともと書かれているコメント文「//の箇所」は省略しますね。
<<ap1AppDelegate.hファイル>>==============================================
#import <UIKit/UIKit.h>
#import "kakudai.h"             //←ここが追加行

@interface ap1AppDelegate : NSObject <UIApplicationDelegate> {
   UIWindow *window;
   kakudai thatObject;          //←ここが追加行
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@end

<<ap1AppDelegate.mファイル>>============================================
#import "ap1AppDelegate.h"
@implementation ap1AppDelegate
@synthesize window;
・・・・省略・・・・
-(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)lanchOptions {

// Override・・・・・・・

  thatObject = [ [ kakudai alloc ] initWithFrame : CGRectMake(0,0,320,480) ] ;  //←この行を追加
  [ window addSubview : thatObject ] ;  //←この行を追加
  [ window makeKeyAndVisible ];
  return YES;
}
・・・・省略・・・・
@end

<<kakudai.hファイル>>=========================================
#import <UIKit/UIKit.h>

@interface kakudai : UIView {
  UIImageView *imgView;    //←この行を追加
}
@end

<<kakudai.mファイル>>==========================================
#import "kakudai.h"

@implementation kakudai

-(void) myProgram {
    imgView = [ [ UIImageView alloc ] initWithImage : [ UIImage imagenamed : @"sample1.png" ] ] ;
    [ self addSubview : imgView ] ;
    imgView.center = CGPointMake(160,320) ;
    
//拡大
    imgView.transform = CGAffineTransformMakeScale(1.5,1.5) ;
}
      //↑このブロック全部追加

-(id) initWithFrame:(CGRect)frame {
    if ( ( self = [ super initWithFrame : frame ] ) ) {
      //Initialize・・・・・・
      [ self myProgram ] ;      //←この行を追加
    }
    return self ;
}
・・・・・省略・・・・・
@end


以上です。結構、追加するところありますが、がんばってみましょう。

で、それぞれのファイルを上書き保存しておきましょう。

まあ、なんでいいから動かしてみましょうってことで、動かし方は次で。
すこしプログラムの話から外れるんですけど、
こういうアプリを作る場合の作業の流れってのがあると思うので、ちょっと書いてみますね。

このトピックで最初に書いたような、PC(マック)の環境やXcodeがインストールされているかどうか
などの話は既に出来上がっていることを前提としますね。
この場合、
 1) まずは、Xcodeでプログラムを記述
    (もちろん、付随するようなリソースデータも必要であれば設定)
 2) プログラム言語ってのは、あくまで人間さまが理解できるように記述されているテキスト
   文書でしかないので、このままではiPhoneでは動かない。
   なので、iPhoneにわかるように翻訳を通してあげる作業が発生する。
   これがビルド(コンパイル)。
   このビルドを行った時点で「人間が記述した原文(プログラム)がiPhoneにとって理解できる状態に
   用意できているか」をチェックする。
   うまく翻訳が出来ていない場合は、エラー表示されるので、どういうエラーなのかを確認して
   原因(原文のミスや手続のミスなど)を修正して、再度ビルドすることになる。
   ※よくあるパターンが、プログラムの記述は正しいのに、どうしてもビルドでエラーが出る場合がある。
    こういう場合によく見受けられるのは、ファイルの名前のつづりがおかしいとか、フォルダの位置が
    おかしいとか、ビルドする場合の規則に違反しているところに気がついていないなどの原因が考え
    られるのですよ。
 3)ビルドが正常に出来たら、シミュレータで実行。
   きちんと動いてほしいものです。
   最初によくあるパターンは「真っ黒で何も出ない」という話(笑。こういう時の原因は、当然表示に
   関係する操作(プログラム記述)に何か問題があるわけです。
   これに陥ると「もういやだ、やめた!」って投げ出す人が多いと思うのです。
   いやだ=わからない=苦痛。
   どんなことでもそうだと思うんですけど、一発で何でもできるのはラッキーなんですよね。
   苦しいけど、それを1つ1つヒモ解き明かして、目標に到達したときの達成感を知ってる人は、
   きっと色んな事にもトライできるんだろうと思うんです。
   特に、このコミュの方はビジネスチャンスを狙っている人ばかりでしょうから、こういう点はよく理解
   されているんじゃないかなと思います。
   まあでも・・・・努力!根性!なんて考えはおかしいですけどね(笑。やっぱり楽しめるかどうか
   が重要なのだろうと思います。

  うまく動かない場合に、ずっと原文を見ながら悩むことが多いと思います。
  いやぁ、なかなか原因特定って難しいものですよね。
  でも、そうならないように、強い味方の「デバッガー」を使いましょう。
  このSDKについているデバッガーは結構強力だと私は思います。
  デバッガーって何って人の為に簡単に説明すると、
  「プログラムを実行して、その経過を見ることが出来るツール」とでも言えばいいでしょうか。

  プログラムって、いろんな情報のやりとりをしますよね?その情報って種類も多いし、形もさまざまだし
  1つだけとは限らず、複数個で1セットの情報なんてのもありえますよね。
  どの場合でも、どこかに保管しながら、移動させたりして伝達させているのですよね。
  じゃあ、その保管状態がわかれば、意図した状態を実現しながら動作しているのかどうかが
  わかるってもんです。
  電子機器の情報伝達の速度は、人間では追いつくことなんて不可能だし、そんな必要もないと
  思います。電子機器の伝達速度が速いのなら、人間に合わせさせればいいわけです。
  それがデバッガーと思えばいいわけです。
  すごくたくさん書いた構文を、機械はすごいスピードで走り回っています。だからどこがおかしいのか
  がわかりにくい。だから1構文づつ動かして、思うとおりになっているかをチェックする(ステップイン)
  のがよいというわけです。
  (あまり最初にデバッガーの細かい所の話を書くと混乱するので、とりあえずここまで^^;;)。

 以上、1)〜3)の繰返しなのだろうと思います。

さて、先程記述したプログラムをせっかくですからビルドして動かしてみましょう。
(って、ほんとに動くのかな・・・・・^^;;;;;)
ごめんなさい。11番のコメントの中で、

<<ap1AppDelegate.hファイル>>==============================================
#import <UIKit/UIKit.h>
#import "kakudai.h"             //←ここが追加行

@interface ap1AppDelegate : NSObject <UIApplicationDelegate> {
   UIWindow *window;
   kakudai thatObject;          //←ここが追加行
}

としていましたが、最後の kakudai thatObject; が間違えていました。

   kakudai *thatObject;

が正解です。
こうしておかないとフリーズします^^;;。すいません
ビルドを行う場合は、画面上に表示されているバーの「ビルド」をクリックします。
色々メニュー項目がありますが「ビルド」を選んでください。

すると、ap1の窓の下端左にメッセージが出ます。
うまくいけば、「ビルドは問題なく完了しました」と出ますし、
どこかにエラーがあれば、「Build failed (○個のエラー)」と表示されます。

エラーがでた場合は、その窓の下端右に「失敗 !○」というかんじにメッセージが表示
されています。○は数字ですが、その個数分おかしなところがあるという事です。
この場合は、その数字をクリックしてみましょう。

すると、別に窓(標題:ap1AppDelegate.h : ○○ - Build Results)が現れ、
上半分に、どういうエラーなのかが表示され、
下半分に、その原文(プログラム)のエラーと思われる行に!が赤くついて表示されます。

エラーの種類はいろいろありますが、今ここで説明すると膨大な文章になると思うので、
とりあえず後日にまわしますね^^;。

うまくビルドされた方は、今度は実行(シミュレータで表示)ですね。
画面上部のバーに「実行」と書かれているところがありますので、これをクリックすると、
いろいろメニュー項目が出ます。
まあ、とりあえず「実行」を選択しましょう。

これで、自動的に、iPhoneシミュレータが起動して、その窓が表示され、
その窓の中で、プログラムの実行結果が表示されます。

というのが基本的な仕組み。

もし、うまく動かなかったら何か原因があると思うのですが、今ここで確実な原因を
述べることは難しいです。というのも、人それぞれで利用されている環境も異なりますので
PCの環境や、プログラム構文のミスなど、どういう原因でとは言い切れないのです。
とにかく、エラーとなった場合は、いろいろ想定してみなければなりません。
これが大変なんですよねぇ。

まあ、試された方は、うまく動いたでしょうか?
うまくいかなかったらごめんなさい。
とりあえず、動作していようがいまいが、次のステップに進んでいきましょう。
諦めないことが大事だと思います。

次は、11番コメントで書いたプログラムの1つ1つを追って、
何をどうしているのかを説明してみようかと思います。
そろそろ難しい用語やわかりにくいことが多くなってくる状態ですが、めげずに
がんばってくださいね。

11番のコメントのプログラムには、4つのファイルに設置したものを書きました。
その中で、まずは、<<kakudai.hファイル>>から順を追って説明してみます。

<<kakudai.hファイル>>=========================================
#import <UIKit/UIKit.h>

@interface kakudai : UIView {
  UIImageView *imgView;    //←この行を追加
}
@end

こんな感じでしたよね。

こまかく説明すると、余計に混乱するとおもうので、
「こういう決まりなんだ!」と覚えてほしいことがあります。

.h ファイルには、プログラムを動作される順番が書かれているのではなく、
 プログラムで利用する為の「一時記憶する箱を定義しておく」
のが主目的だと思ってもらえればよいかと思います。

前述のコメントで「アプリってのは、情報の伝達を行っているんですよ」と
書いたかと思います。どんな電子機器もコンピュータ制御されている場合は、
何かの情報を何かに伝達するという行為を行っています。

例えば、みなさんが使っているパソコンは、
「本体」「キーボード」「マウス」「モニタ」などがありますよね。
人間さまが中心となって、何か指示して初めて動作してくれるわけで、
その指示の方法は、キーボードを叩いたり、マウスをクリックしたりする事が
基本だと思います。
例えば、キーボードの中には、スイッチがたくさん入っているので、そのキーを
叩けばスイッチが入って電気が流れる。これによって信号が、本体に伝達
されているわけです。その信号を本体が考えて、本体からモニタに対して
文字を表示するという信号を送っているわけです。
これを人間さまは、目で見て確認するわけですね。
つまり、いろいろな機器を経由して、情報が伝達されて、動作する
という仕組みだと思います。

iPhoneやiPadも同じ仕組みですよね。
ただ、キーボードやモニタが無い代わりに、液晶画面がその両方を備えて
くれているだけだと思います。
液晶画面だけなので1つしかないように感じますけど、伝達の方法は
パソコンと同じでしょう。
指で液晶(というキーボード)をタッチする=信号をiPhoneのCPUに
伝達する。CPUはタッチされた文字(や画像とか)を表示する。
という感じです。

この伝達を行う場合に、「それぞれの機器には、その情報を一時記憶
しておく場所があって、別機器の一時記憶できる場所に伝達する」という
仕組みになっているという感じですか。

ここで理解しておいて頂きたいのは、この、それぞれの機器の一時記憶
しておく場所を、人間にとってわかりやすい状態で管理しておきましょう
という事なのです。

上記した、プログラムの{ }の間に書かれているものが、その一時記憶
の箱だと考えてください。
この事例では
  UIImageView *imgView;    //←この行を追加
の行ですね。
右側に書いた「//←この行を・・」ってのはコメントしただけなので無視
してOKです。
このような箱を一般的には、”変数”と呼ぶんです。
(プログラム経験者の方は重々ご理解だと思うので無視してくださいな)

このへんの話はiPhoneアプリの話というより、プログラム言語(Objective-C)の話になります。
興味があればその参考書や参考サイトを見てくださいね。私の説明より解りやすいと思いますので。

で、変数のお話。
どうしても無視できない事なので、もう少しだけ変数について書いておきます。

私も正確には理解していないので、詳しい方からバッシングがとびそうですが、
iPhoneアプリを作るにおいては、変数には大きく分けて2つ種類があると
思っておけばよいのかと思います。

1 スカラー変数
2 オブジェクト変数

用語名なんて覚えなくていいです。どういうものなのかさえ理解できておけば
よいと思います。
まあ、どっちも箱なんですよ。箱っていっても、色々な形があるでしょ?
四角い箱もあれば、丸い箱もある。
それと同じ感覚です。

スカラー変数ってのは、簡単です。
数字や文字やスイッチON/OFFなどの情報を入れておける箱です。
いろいろ種類があるんですけど、まあ・・・・、
 int ←整数の数字を入れることが出来る
 float ←小数の数字を入れることが出来る(厳密にはもう少し説明しないといけないですけど)
 bool ←YESかNOの識別を入れることが出来る
ってくらいでOKだと思います。
まあ、複雑なアプリを組みだしたら、これだけでは困る(他にも色々な種類はあります)と思います
が、今は頭をクリアにしてこれだけにしておきましょう(笑。

スカラー変数については、作り始めたら、勝手に覚えていくと思いますので、
それ以上に重要なオブジェクト変数について話してみようと思います。

同じ「変数」といいながら、名前が違うのには意味があります。
スカラーってのは文字や数字などの「いかにも情報」を指しているのですけど、
オブジェクトってのは、もっと具体的に人間の目に見える物体だと思ってもらうと良い
かもしれません。
せっかくiPhoneアプリを元にしているのですから、具体的にいいますと、
このプログラム事例では「画面に画像を表示して、拡大してみる」としていましたが、
この画像ってのがオブジェクトそのものです。

このプログラムの概要を先に説明しておくと、
1) 画像のファイルは「Resources」フォルダに登録しておいた。
  =プログラムから画像のデータを閲覧(参照)できるようにしておいた。
2) 画像をいきなり、画面に表示することはできないので、
  とりあえず、表示できるようにする為の箱を用意しておいた。
3) 実は、2)の箱を使うと、箱そのものを拡大する機能があるので、
  画像を、箱に入れておいて、その箱を拡大することで、画像も
  拡大してみた。
という流れなんです。

この画像データそのものをオブジェクトといいますし、この箱もオブジェクトと
いいうんです。
ちょっと解りにくくなってきましたかね^^;;。私の説明ヘタなので。
オブジェクトとは、総称なので、いろんな形をした箱と思ってください。
そのオブジェクトの種類によっては、色々な情報が1つのオブジェクトの中に
存在しています。

たとえば、UIImageというオブジェクトを作ると、画像データを入れておける箱
を用意できます。この箱には、leftCapWidthなんて情報が用意されておりまして、
これを使うと用意した箱の大きさに対してどの位置に画像を配置するか
なんてことが出来るのです。(違ったかな・・・使ったことねえから詳しくない^^;)

UIImageViewってオブジェクトを作ると、UIImageみたいに画像を入れておける
箱が作れるんですけど、UIImageには出来ない機能があったりします。
例えば、この事例でやっている「拡大」。

画像を表示するだけならUIImageで良いんですけど、拡大させたり縮小させたり
回転させたり、といったことはUIImageオブジェクトでは出来ないんですよ。
でもUIImageViewであればそれが出来るように、iOSで用意されています。

先程もいいましたが、画像を拡大するのじゃなく、画像を入れた箱を拡大
しているのです。だからUIImageViewという箱を作っておいて、そこに画像を
入れて、箱側を拡大させているのがこの事例プログラムの流れなんです。

やっと最初の話に戻ります。
.hファイルに書かれている{ }内には、変数を用意しています。
ここで「あとで拡大をさせたい」が為にUIImageViewという箱を作っている
のです。
なんて名前の箱であるかが「imgView」なのです。
ここは好きに名づけできますよ。

で、少しだけ気になる点が、imgViewの前に「*」がついてますよね。
これはポインタといいます。
えっと・・・・・・・・・・・・・・・・・・・・
ポインタを説明しだすと、きっと嫌気がさしてくると思います(笑。
(ちまたでは、プログラム言語を覚える人が必ずポインタについて理解する時点で
つまずいてやめてしまうなんて話をよくききます)。

あのですね、覚えなくていいです(^^;。
今、理解もしなくていいです。
理解できればそれにこしたことはないんですが、皆さんの本来の目的は
「iPhoneのアプリをつくりたい」ってことでしょうし、別にC言語を覚えることでは
ないはずです。
ここで止まらなくても、作れるんですよ。

このUIImageやUIImageViewで オブジェクト変数を作る場合は、その
変数名に*をつけておく と覚えておけばいいです。
ただ、それだけ。「なんで?」と思うのは10年後にしましょう。

みなさんにとっては、画像を拡大する箱を用意したという事実があれば
それだけで良い話だと思います。

kakudai.hってファイルは、この箱を用意しただけなんです。

なんでそうするかっていうと、kakudai.mってファイルでこの箱(imgView)を利用する
からなんです。
じゃあ、kakudai.mの中身を見てみましょう。

少し前に書きましたが、
プログラムは最初に「init・・・」を通ります(もちろん、そう仕向けるんですけど)。
なので、最初は
-(id) initWithFrame:(CGRect)frame {
    if ( ( self = [ super initWithFrame : frame ] ) ) {
      //Initialize・・・・・・
      [ self myProgram ] ;      //←この行を追加
    }
    return self ;
}
ここを通っています。

見てるだけでややこしそうに見えますので、スッキリさせる為に
この途中で「myProgram」というプログラムを経由させています。
なので、みなさんはmyProgramの中だけ理解していきましょう。

-(void) myProgram {
    imgView = [ [ UIImageView alloc ] initWithImage : [ UIImage imagenamed : @"sample1.png" ] ] ;
    [ self addSubview : imgView ] ;
    imgView.center = CGPointMake(160,320) ;
    
//拡大
    imgView.transform = CGAffineTransformMakeScale(1.5,1.5) ;
}

ややこしそうだな・・・・って思います。ええ、思いますとも。
一気に全部見るからややこしいんです。1つ1つを理解していきましょう。

まずは
    imgView = [ [ UIImageView alloc ] initWithImage : [ UIImage imagenamed : @"sample1.png" ] ] ;
さっそく、箱出てきました。
imgViewって箱です。さっきは*imgViewって書いていましたよね?。ここでは不要なんです。
「なぜ?」。聞いてはダメです(笑。必ず混乱します。いずれ解りますから、「こういうものなんだ」と理解
して「覚える」ようにしましょう。

(余談) プログラムを初めて書く人の為に説明しておきますが、
  プログラムの書き方として、「変数」に何かを入れる場合は、右の内容を左に入れるという規則があります。
  左imgView ← 右[[ UIImageView ・・・・
  という感じです。なので、A = B とすれば、BをAに格納するということを指します。

じゃあ、どんなものを入れているの?ということで、
UIImageViewと書いてありますよね?。そうです。imgViewは.hファイルでUIImageViewのオブジェクト変数
として用意しておいたので、どういうUIImageViewなのかをここで”宣言”しています。
{ と違って、 [ ってのがありますよね。これも規則として覚えていきましょう。
 [ UIImageView alloc ]
となっている部分で、「オブジェクト変数を作りますよ」と教えているのです。
.hファイルで箱を作ったのはいいんですけど、その箱の中って汚れているかもしれません(笑。
なので、空っぽの状態で作りますよと教えているのです。
これを インスタンス生成といいます。
iPhoneアプリを作っていくためには、このインスタンスについて理解しなければなりません。
まあ、理解といっても、どのタイミングで、どういう手続でプログラム上に記述しておけばいいかを
知っておくだけです。これは、プログラムを書けば書くほど解ってくると思います。


この [ UIImageView alloc ]の後に、initWithImage : ってのがありますね。
UIImageViewってのは、箱ですよ〜って説明しました。このinit・・・は、
「imgViewという箱を作るのに、どんな箱の大きさにしておくの?」という事を
指定しているのです。

withImageって書いてあるじゃないですか。
なので、この後に書かれたImage(画像)のサイズに合わせる
って意味なんですよ。
どんな画像かというと、[ UIImage imagenamed : @"sample1.png" ]という画像です
と指定しています。
まあ、見ればわかると思いますが、sample1.pngというファイル名(imagename)の画像
を指定しているわけです。

こういうimagenamedとか、initWithImageとかは、どういうオブジェクトなのかによって
色々用意がされています。
imagenamedはUIImageの場合使えるものですし、
initWithImageはUIImageViewの場合に使えるものです。
こういうのは、どうやって調べればいいんでしょ?
プログラム作成に慣れた人はすぐにわかるんですけど、初めて作る人の為に説明
しますと、「○○というオブジェクトを作った場合に、どういう指定が用意されているかは
iOSで決められている」ということを理解しておきましょう。
じゃあ、どうやってそういう指定種類を調べるの?という話ですが、
Xcodeには、「ヘルプ」メニューがありますので、これを利用するんです。
画面上のバーの右に「ヘルプ」ってありますよね。
ここをクリックすると、メニューが現れます。
この中の「デベロッパドキュメント」を利用します。

「Xcode Quick Start」って窓が出ます。
英語です^^;;;;;。どこをクリックすればいいのかわかりにくいです。
この窓の上に「Back/Forward」「Home」「Bookmarks」と書かれたボタンがありますので
「Home」を押しましょう。
メニューが現れますので、「iPhone OS 4.0 Library」を選択しましょう。
※人によってはOSのバージョンが違うと思いますが、現在は4.0が基準だと思います。

また英語の表記でズラズラっと出るはずです。
色々な種類のオブジェクトがあるんですよ。それと、オブジェクトの説明だけじゃなく、
色々な使い方の説明やサンプルも見れるようになっているので、調べるのは一苦労
するはずです。

ここでは、せっかく事例プログラムを用意しましたから、実際に使われているオブジェクトの
種類について調べてみましょう。
例えば、UIImageやUIImageViewを使用していますので
既にキーワードは解っている前提で考えていきましょう。

その窓の右上に虫メガネで文字入力できる欄がありますので、そこに
「UIImage」と入力してみましょう。
自動でパラパラと窓の内容が変化していると思います。
落ち着いたら、UIImage Class Referenceと書かれたものが出ているはずです。

次に続きます
まあ・・・・・全部、英語なんですよね。
つまり・・・・・「iPhoneアプリ作りたいなら、少しは英語勉強してね」って事です^^;。
とはいっても、そんなに難しい単語は出てきません。
それに、みなさん、ネットを使っていると思いますので、どこかの翻訳サイトで単語の
意味を調べましょう。
なんとなく解ってきますので。
(私はこれで調べるので時間がかかっていますねぇ。別に書かれている文章全部を
翻訳する必要はないので慌てたりはしませんけど)

その窓をスクロールして、もう少し下の文章を見てみましょう。
例えば、Supported Image formatsという欄を見れば、どういう画像ファイルなら
利用できるのかなどが書かれていますね。
ああ・・・・・・jpgいけるんだな。知らなかった(笑。

もう少し下の説明をみていくと、Tasksって欄がありますね。
ここに、Cashed Image Loading Routinesってのがあって、
そこに先程の「imageNamed」がありました、ありました。
更に下に色々な指定の種類が書かれているので、興味があればみてください。
でも、今はやめておきましょう。混乱します。
まずはこの事例を元に考えているのですから、まずは1つ1つを理解するほうが
あとあとの為になると思います。まずimageNamedを知りましょう。

この指定の種類(imageNamedなど)は青くなっていると思います。
つまり、リンクが張られているということです。
imageNamedの詳細を知りたい場合は、これをクリックしましょう。

imageNamed:
Returns the image object associated with the specified filename.
ってありますね。
わけがわかりません^^;。まあ、訳せばいいんですけど、聡明な方なら
ピンときているでしょう。filenameって書いてあるんだから、ここでファイル名を
指定するんだなって。

この英文の下に、記述事例があります。
+ (UIImage*)imageNamed : (NSString*)name

事例のプログラムに書かれた例を参照すると、
 imageNamed : @"sample1.png"
ってしていましたよね。
つまり、「@"sample1.png"」ってのはNSStringというオブジェクトなのです。
このオブジェクトは文字列を表します(String)。

ちなみに、今後を考慮して、覚えておいてほしいのですけど、
iPhoneアプリを作る場合に、文字列指定をする場合は、
「 "sample1.png" 」ではなく「 @"sample1.png" 」という風に文字列先頭に@をつけて
おかねばなりません。
これはObjective-Cを使っているからなのです。
「なぜ?」とか聞かないでください。知りません^^;。

更に下にはズラズラと英語の長文が・・・・・。
本当は重要なことが書かれているのですけど、今は無視しましょう。
無視しても問題ありませんです。
せっかくですから、UIImageViewも使ってますので、同じように調べておきましょう。

窓右上の虫メガネ部分で「UIImageView」と入れましょう。
「UIImageView Class Reference」って出ますね。

UIImageの時と同じように操作してみてみましょう。
もう少し下にTasksを見つけました。
先程の「initWithImage」がありますね。

で、クリックする前に、ちょっと余談。
少し下の行に「Image Data」と太い文字で書かれた場所に
「image property」
「highlightedImage property」
ってのがあります。
「property」ってのがイタリック(斜体)で書かれています。
プロパティとは、うーん、属性って意味かな・・・・。
まあ、オブジェクトをインスタンス生成(18番のコメント参照)すると、
その変数(この事例ではimgView)には決められた設定パラメータが
自動でつくんです。
(ちょっと説明のしかたが悪いですね・・・・)

具体的に書きます。

 imgView.image = ・・・・・・

imgViewというオブジェクト変数のあとに .プロパティ名 をつけて、
その内容をあとで指定する(・・・・の部分)と、そのimgViewの状態
が変更されるんです。

例えば、UIImageViewの場合は、imageってプロパティがあります。
この事例では、インスタンス生成する時点で「どのファイル名の画像か」を
指定しながらimgViewというオブジェクトを作ったのですが、
プログラムの途中で、この画像を差し替えたりできるんです。

最初は、
  imgView = [ [ UIImageView alloc ] initWithImage : [ UIImage imageNamed : @"sample1.png" ] ;
と宣言しておいて、1度この状態で画面に表示したとします(表示の方法は後述します)。
しばらくしてから、
  imgView.image = [ UIImage imageNamed : @"sample2.png" ] ;
としてやることで、違う画像ファイルに切り替えられるんです。
このimgViewという”箱”は何も変わっていません。中身である画像が切り替わっただけです。

こんなことが出来るんですね。

他にもプロパティがありましたね。ここでは説明しませんが、オブジェクトによっては色々なプロパティが
ありますので、ぜひ調べておきましょう。

では、最初のinitWithImageの話に戻りましょう。
「Instance Methods」という欄に initWithImageは記述されていますね。
まあ、英語がどうこうというのは置いておいて、
記述事例が
- (id) initWithImage : (UIImage*) image
となっています。
imageという部分は
The initial image to display in the image view.
と説明があります。まあ、ちゃんと言えば「インスタンス生成した時点で
最初に表示する画像を指定してください」って意味です。
ここはUIImageになっていますね。なので、[UIImage imageNamed : @"sample1.png" ]
を指定したのです。

他にも色々説明文が書かれていますが、見ないほうがいいです^^;。
ほとんど使わないことばかり書いてあります。
ついでに知っておいてほしいことがあります。

もう1つヘルプで調べてほしいのですよ。
今度のキーワードは「 UIView 」。

まあ、これが何なの?ってのは置いておいてください。いずれ解ります。
今は、UIViewってのを知らないと損をするので先に知っておきましょうといっているだけです。

ヘルプのこの窓で虫メガネ欄で「UIView」と入力してみましょう。
※他にも「UIView」という文字列を含んだオブジェクトや命令文が多く存在するので、
 右側に正しく表示されていないかもしれません。
 左に「API」と小さく書かれた欄がありますので、「UIView」をクリックしましょう。
 右側に「UIView Class Reference」と出ていれば正しいです。

Tasksを探しましょう。
まあ、色々なことが書かれていますが、
「Modifying the Bounds and Frame Rectanges」という欄に注目してください。
ここにも4点ほど、プロパティがあります。
これを覚えておきましょう。
この事例プログラムでは、この中の2点を利用しています。
「center」と「transform」です。
(「frame」と「bounds」は後日説明します)。

まあ、なんとなくわかりますよね。
センターだから、そのオブジェクトの位置情報です。
トランスフォームだから変形、つまり今回のテーマ、拡大はトランスフォームを使っています。

で、なぜUIImageViewじゃなくUIViewでこれを説明するのかというと、
UIImageViewってのは実は、UIViewの1種類なのです。
なので、UIImageViewはUIViewと同じことが出来るってことが言えます。

UIView = .centerや.transformが使える
UIImageView = .imageが使える。更に、.centerや.transformも使える

ということです。
これは、昔アップルがUIViewという仕組みを作って、それに追加機能として
UIImageViewという仕組みを作った=継承
ということから成り立っています。

よく皆さんが、iPhoneアプリを使っていて目にする、決定ボタンやiPod機能の中の
ボリュームのゲージなどは、実はUIViewから継承されたものなので、同じように
.centerや.transformが使えるんですよ。
つまりボタンの位置を変えたり、大きさを変えたり(回転もできます)が可能なんです。

.centerや.transformを説明する前に、
せっかくimgViewというオブジェクトを作ったのですが、ただ、「作りましたよ」と言っただけで、
画面には表示していません。
なので表示をしましょう。

文章で表現するとちょっとわかりにくいとおもうのですが、
imgViewという画像オブジェクトを表示するということは、「画面という(既に表示された)オブジェクトに
重ねてimgViewというオブジェクトを追加させる」ということになるんです。

事例プログラムでの該当行は
   [ self addSubview : imgView ] ;
となっています。
この self とは、このプログラム自体(プログラムもオブジェクトなんですよ)を指しています。
このプログラムはkakudaiという名のオブジェクトなんです。
その変数がthatObject。
これはap1AppDelegate.hファイルで宣言されています。
ちょっとややこしい話なので、この話は置いておきましょう^^;。

とにかく、self というものがあるんです。これが既に画面に表示されているのです。
(「なぜ?」は禁句)
そこで、そのselfに対して、追加のUIView(つまりaddSubview)をします。
その追加のUIViewはimgViewですよという構文なのです。

これで、表示がされます。

まあ、一応ちゃんと表示されます。
だけど、正直、正確じゃないんですよね。
だって、画面に参加させただけで、どこに表示するのか指定していませんので。
まあ、最初にaddSubviewさせた場合は、基本的に元のUIView(ここでは画面そのもの)
の中央に自動的に表示されます。

事例では、
   [ self addSubview : imgView ] ;
    imgView.center = CGPointMake(160,320) ;
として、中央付近に表示しています。
※ iPhoneの画面構成は横:320,縦480なので、中央は160,240です。だから事例はちょっと下気味。

んで、そのあとに拡大の行。
    imgView.transform = CGAffineTransformMakeScale(1.5,1.5) ;
transformは色々な機能があるので、詳細は後日説明しますが、
ここでは、大きさ=Scaleを画像サイズに対して横、縦に1.5倍に拡大
しているということです。

まあ、やってるのはこれだけなんです。
今頃言うなと言われそうですが、
たぶん、この事例プログラムは正しく動いていないと思います・・・・・。
私、実は、ががっと書いたはいいが、実際に動かしてみていないんですよ^^;;;;。
すいません。

書きながら思いましたが、プログラムの記述が足りないなと。
1度ちゃんと動作させてみてから、正しいものを掲載したいと思います。

いいかげんなヤツですいませんです^^;;。

まずは、意味を理解してもらえればありがたいです。
実際に動かしてみたら、一応、動きました。
みなさんはどうでしょうか?

興味があれば一度試してみてください。
はじめまして、iPhoneアプリ作成初心者の者です。

ひとつ作業で戸惑っているのでこちらに書きこませてください。
今現在、ひとつのゲームアプリを作成させたはいいものの、ゲーム
ではなくてはならない「スタート画面」の作成方法がわからず困って
おります。ネットでこれまでは作成情報などを探していましたが、
ここにきて情報が少なく行き場を失っております。

素直に教本を買い求めた方が早いのかもしれませんが、もし作成方法
を御存じの方がいらっしゃいましたら、ご指導頂きたいと思います。
よろしくお願い致します。
XC-BART@102さん

どうもはじめまして。

そちらが「スタート画面」と呼ばれているものをどういうものを想定していらっしゃるのか
よくわかりませんが、
一般的にスタート画面はそのゲームの扉絵的なものだと思いますし、それを表示
してから何かアクション(ボタンをタッチするなど)してゲームをスタートさせるのが
普通だと思います。
的を得た回答になるかどうかはわかりませんが、
オーソドックスな手法としては、
  iPhoneの場合は、スクリーン(実画面)となるUIWindowが表示されているので、
 そこに大きく分けて3つのUIViewを参加させるのが定番。
 この3つは、
 A) contentとなるView(土台)
 B) ゲームプレイ以外のView(何個あってもOK)
 C) ゲームプレイ用のView
 という感じで、
 ( 1 ) UIWindowにA)をaddSubviewしておく
 ( 2 ) A)にB)やC)をaddSubviewしていく
 という感じかなと思います。
 つまり、A)は全てのViewを管理する為の土台であると思えばいいかと思います。
 もちろん、B)やC)それぞれに固有で使用するviewをaddSubviewしていくのは問題
 ありません。

 結論をいうと、A)の上に配置されたviewを切り替えていくという感じですね。

 あくまでも、こういった手法はオーソドックスであって、必ずしもこの方法を採用
 する必要はないと思いますが、こうしておくと、たくさん存在するviewをうまく
 管理していくことが出来るのではないかと思います。

 上記の方法を採用した場合は、A)は常に表示されていることになりますね。
 表示しているといっても、A)そのものはUIColorでclearColor(透明)にしておけば
 見えないのと同じですので気にする事はありません。とにかくcontentという「管理の
 為の器」を用意したに過ぎませんので。

 あとは、B)などでスタート画面用の画面構成を考えて盛り込んでいくとやりやすい
 のではないかと思います(releaseも容易ですし。iPhoneでは機種によっては
 メモリが非常に小さい場合がありますので、くれぐれもリークしないような構成と
 手続を心がけたほうがよいとは思いますよ^^)。

 スタート画面の構成(どんな画面にするか、どういうオペレーションでゲーム
 プレイのviewを呼び出すかなど)はご自身のセンスで構築されればいいのでは
 ないでしょうか。少なくとも既にゲームそのものは作られている程の理解度ですから、
 さほど難解ではないとは思いますので。

 一般的には、スタート画面(タイトルやゲーム画像のサンプル)を表示して、
 開始する為のボタンを1つのview(IBのボタンでもいいでしょうね)をタッチ
 して、タッチがEndedしたらスタート画面のviewの上にゲーム画面のviewを
 重ねて表示して、その表示が完了したら裏に隠れたスタート画面のviewを
 消去してしまうって感じですかね。
 まあ、もし、ゲームプレイが終わって、再びスタート画面に復帰することが
 あるのであれば、どうせ裏に隠れているので消去までする必要はないかも
 しれません。ただし、ゲームプレイ中はスタート画面用のview分のメモリが
 常駐してしまうので、注意は必要です。

 私なんかは、スタート画面をタッチしたら、transitionでフリップさせて
 ゲーム画面のviewに移り変わるなんてのはよくやります。
 (まあ、この方法はちょっと注意が必要ですけど^^;;;)。

 ご質問になられたことに的を得た回答になっていませんでしたら申し訳ないです。

 ちなみに、これら一連の方法をIB(interface builder)で作成する方法は
 私は知りませんです^^;。私は全てコーディングで作る人なので。
 あしからず。
>ざくりーんさん
ご丁寧なアドバイス誠にありがとうございます。
アプリの「ア」の字もわからないままに書いているので、色々とわからない箇所はございましたが、これで少しは楽になれてかなと思います。。

今後も教本を片手に勉強を続けていきたいと思います。
御指導ありがとうございましたm(_ _)m
人によって捉え方はさまざまですが、私は現在色々出版されている教本類は
ほとんどが「SDKのインストール方法」「Xcodeの操作」「Objective-Cの基礎中の基礎」
「iOSで用意されている基本的なオブジェクト、そのメソッド類」といった『ネットなどで
自力で調べればわかりそうな事項』ばかりが載っているものが大半だと思います。
ある程度、プログラムを作っている中級者にとっては、こういった事項よりも
『これらを使ってどう応用すればいいの?』
という点の方が知りたいのではないかと思います。
XC-BART@102さんのように、「どのような構成で作ればイメージしやすいか」
「どんなテクニックを使えば思うような動作が表現できるのか」などが
求められているような気がします。

私は教本は2冊だけ買いました。
A) iPhoneSDKプログラミング大全(アスキーメディアワークス)
B) iPhoneデベロッパーズクックブック(ソフトバンククリエイティブ)
始めた頃はA)しか売ってなかったのですが、これは基礎中の基礎中の基礎が
書かれているので最初は重宝しました。
B)は少しだけテクニックについて書かれていたので買ったのですが、ほとんど
読んでいません^^;。
今は他にもっとよさげな本がたくさん出ているようですが、私の中の結論では
「本読むよりも、作っていくうちに自分のやり方を磨く」事のほうが重要だと
思えるようになりました。
iOSで用意されているメソッド類はSDKのドキュメントで調べりゃいいですし
(英語なので大変だけど、慣れればそんなに難解ではないと思います)、
ネットでも
http://profo.jp/wiki/index.php?FrontPage
などのように、しっかりまとめてくれているものもあります。
問題は、これをどう使うかという点だと思います。

1つのオーソドックスなテクニックですが、
ゲームなどを作る場合、タイマー割込みを利用される事が多いかと思います。
私はアプリ開始直後にいきなりタイマー処理を行わせることが多いです。
そして、タイマー処理の中で「階層」を用意し、それを管理しながら処理の順序を
決定したりします。
例えば、グローバル変数でFirst,Second,Third,・・・などのintを用意しておき、
Firstが最上位、その下層がSecond、更にその下層がThirdなどとしておき、
タイマー処理した場合に必ず呼び出されるルーチンの中で
-(void)timerMainRoutine{
 switch(First){
  case 0:
    [self startSecond01];
    break;
  case 1:
    [self startSecond02];
    break;
 }
}
-(void)startSecond01{
 switch(second){
  case 0:
    [self startThird01];
    break;
  case 1:
    [self startThird02];
    break;
  case 最後:
    second = 0;
    first++;
 }
}
といった構成を用意したりします。
ある程度、プログラムを書かれる方なら何を意図しているのかは
わかるかと思います。

この手法が良いとはいいませんが、こういった手法などを書いた本は
あまり見かけたことはありません。ですが、ネットではこういう事を
書いたサイトが見受けられるので、個人的には教則本よりも
サイトを色々調べるほうが身になるかもと思います。
もちろん、やり方は人によってさまざまなので、私の見解を述べたに
過ぎませんので。
どうも初めまして。

大変申し訳ないのですが、周りに相談できる相手もおらず。。。
皆さんの知恵をお借りできないかと思いました。

「iphoneのメニュー画面のように、3行×4列のアイコンを自由に並び替える画面」
を作りたいのですが、
この「自由に並び替える」というのが実現できずに困っています。

今の自分のやり方は
アイコンをNSMutableArrayに入れておき、0〜3番目を上段、4〜7番目を中段、残りを下段に表示させています。

なので、入れ替えは
1、タッチされたビューが配列の何番目の要素かを調べて、oldPosに番号を入れる
2、ドラッグが終わった場所が、配列の何番目の要素かを調べ、newPosに番号をいれる
3、oldPosとnewPosを使って、配列を入れ替えて、もう一度表示

と考えているのですが。。。うまくいきません。

そこで、みなさんの知恵をお借りできないかと思いました。


似たようなサンプルがあるとかでもかまいません。

どうか力を貸してください。

ちなみに今現在のタッチエンドメソッドもあげておきます。

以下ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー


- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

//変数の準備
float x;
int tagOfMovedCard;
int oldPos, newPos;
CGRect frame;


//ドラッグが終わったことをインスタンスとして保持
UITouch *touched = [touches anyObject];

//ドラッグが終わった場所の位置を求める
CGPoint dragEndPoint = [touched locationInView:self];

//配列に格納されたビューのセンター位置を求める

// ドラッグされたカードの元の場所を求める(oldPos = 0〜3)
tagOfMovedCard = self.tag;
for ( oldPos = 0 ; oldPos < 12 ; oldPos++ ) {
int tag = ((BookImageView *)[self.shelfList.shelf objectAtIndex:oldPos]).tag;
if ( tagOfMovedCard == tag ) {
break;
}
}

for ( newPos = 0; newPos < 12; newPos++) {
BookImageView *anywayBook = (BookImageView *)[self.shelfList.shelf objectAtIndex:newPos];
CGPoint viewPoint = .center;

//ドラッグが終わった場所と配列から取り出したビューの差を求める
CGFloat deltaX = fabsf(dragEndPoint.x - viewPoint.x);
CGFloat deltaY = fabsf(dragEndPoint.y - viewPoint.y);

//配列の中にあるビューと求めた差でもっとも近い配列の要素を探す(つまり一番近い場所にあった配列の番号を取り出したい)
if (deltaX <= 30 && deltaY <= 30) {
break;
}


}

// ドラッグが終わったのでカードの移動処理を呼ぶ

//(=今動かしているビューselfと一番近い配列の番号がわかっているのでそれを使って、入れ替え)
[shelfList.shelf removeObjectAtIndex:oldPos];

// ドラッグ対象のカードをarrayの新場所に挿入する
[shelfList.shelf insertObject:self atIndex:newPos];


// カードの場所をアニメーションで移動する
[UIView beginAnimations:NULL context:NULL]; // アニメーションのブロック開始
[UIView setAnimationDuration:0.3]; // アニメーションの時間

[shelfList showImage];

}
>m-kodai loves 紫草さん

どうもはじめまして。

NSArrayなど使わずに、単にviewを入れ替えればいいのでは?
そのアイコン種類情報がほしいならNSArrayではなくint[]なりで出来ますし。
NSArray使うと便利そうに見えますが、種類の異なったオブジェクトが混在した
配列になりがちで管理しにくい=バグに陥りやすいと思いますけどね。

それに、
>3、oldPosとnewPosを使って、配列を入れ替えて、もう一度表示

この「もう一度表示」という意味がよくわかりません。
アイコンはviewにしているのでしょうから、単純に入れ替えだけすれば良い
と思いますが・・・。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

目指せ!iPhoneアプリ開発で起業 更新情報

目指せ!iPhoneアプリ開発で起業のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。