はてなブックマークに追加

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
はてなブックマークに追加

iPhoneアプリ:画像ビュアを作る




サイトを移行しました。
iPhoneアプリと、そのプログラム



さて、これまで3回のiPhoneネットワークプログラミング
iPhone ネットワークプログラミング その1
iPhone ネットワークプログラミング その2
iPhone ネットワークプログラミング その3
を書いてきました。
ここいらで、総まとめとして一つアプリを作ってみたいと思います。


今回作成するアプリは画像ビュアです。
Downloadボタンをタップすると、
プログラム中にハードコーディングされたURLから画像をダウロードしてきて
iPhoneの画面上に表示するという、実用性0のアプリを作ってみたいと思います(笑)

完成図がこちら。
生意気にもプログレスバーなどもつけてみました。
(そのせいでややこしくなったけど・・・)

iphonenetworkprogramming2.jpg

さて、ではXcodeで開発を進めていきます。
毎度おなじみの手順ですが,

Xcodeの「新規作成」-> 「ファイル」->「新規プロジェクト」を選択。
プロジェクトの種類「Application」でテンプレート「View-based Application」を選択。
プロジェクト名は「PhotoViewer」にします。

エディタが起動したら、まずはIBでGUIを設計します。
左カラムから「グループとファイル」->「Resources」-> PhotoViewerViewController.xib
をダブルクリックするとIBが立ち上がりますので、
次の部品をライブラリからドラックしてきて並べてください。

iphonenetworkprogramming1.jpg


ここまでで、IB側での作業は終了です。
次はXcodeに戻ってプログラムをかいていきます。

PhotoViewerViewController.h
@interface PhotoViewerViewController : UIViewController {
NSFileHandle *file;
NSString *filePath;

IBOutlet UIImageView *imageView;
IBOutlet UIProgressView *progressBar;
double expectedContentLength;
}
-(IBAction) downloadButtonPressed:(id)sender;

@end



PhotoViewerViewController.m
- (void)connection:(NSURLConnection *)connection 
didReceiveResponse:(NSURLResponse *)response {
expectedContentLength = [response expectedContentLength];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
UIImage *img = [[UIImage alloc] initWithContentsOfFile:filePath];
imageView.image = img;
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
if (file == nil) {
NSFileManager *fm = [NSFileManager defaultManager];
[fm createFileAtPath:filePath contents:[NSData data] attributes:nil];
file = [[NSFileHandle fileHandleForWritingAtPath:filePath] retain];
}
progressBar.progress = progressBar.progress +
((long double)[data length] / (long double)expectedContentLength);
[file writeData:data];
}

-(IBAction) downloadButtonPressed:(id)sender
{
NSString *url = [NSString stringWithString:
@"http://blog-imgs-45.fc2.com/i/i/p/iiphoneapp/sky.jpg"];
NSString *directoryPath = [[NSHomeDirectory()
stringByAppendingPathComponent:@"tmp"] retain];
NSString *fileName = [url lastPathComponent];
filePath = [[[directoryPath stringByAppendingPathComponent:fileName]
stringByStandardizingPath] retain];
NSLog(@"%@", filePath);

NSURLRequest *request = [ NSURLRequest requestWithURL:[NSURL URLWithString:url]];
[NSURLConnection connectionWithRequest: request delegate: self ];
}


大半が前3回で説明済みのコードなので理解しやすいと思います。
まず、ヘッダファイルではUIImageViewとUIProgressViewのアウトレットを宣言しています。
このアウトレットとIB側の部品を、次のように接続しておいてください。

iphonenetworkprogramming3.jpg

前回まではviewDidLoadにコアの処理を書いていましたが、
今回はDownloadボタンが押されたときに、ダウンロードを開始したいので
大半の処理はdownloadButtonPressedメソッドの中に移動しています。


プログレスバーの更新はconnection:didReceiveDataメソッドの中で行っています。
現在の進行具合 = 受信量 /ダウンロードサイズ
で求めています。これはプログレスバーの常套手段ですね。

全体のダウンロードサイズ(変数:expectedContentLength)は
connection:didReceiveResponseメソッドの中で求めています。
このメソッドは、iPhone側から送ったリクエストに対してのレスポンスとして呼び出されます。
そのレスポンスを利用して、これからダウンロードするファイルのサイズを取得します。


ダウンロードが終了すると
connectionDidFinishLoadingメソッドがトリガされるので
このメソッドの中で画面の更新を行っています。
Documentフォルダ以下に保存された画像の読み出しには
initWithContentsOfFileメソッドを使用します。


コンパイル&実行して、うまく動作するかを確かめてみてください。
スポンサーサイト

コメントの投稿

非公開コメント

開発アプリ

iDOF 色影 ラテアート ぱすてる

プロフィール

Author:hokuson
京都在住。iPhoneアプリ「色影」や「iDOF」の開発者。アプリのレビューとかもしてみる。博士後期課程@R大学。ついに就職活動なるものをしなければいけないらしい。誰か雇ってください。笑。

カレンダー
09 | 2017/03 | 10
- - - 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 -
カテゴリ
最新コメント
RSSリンクの表示
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。