● Carbon視点でiPhone探求(2009/10/20)

  この記事は、MOSAの会員にのみ読むことができるデベロッパー向けの
  ウェブサイトMOSADeN Onlineのに掲載された記事です。ほぼ一ヶ月
  遅れでここに掲載されて行きます

 〜 テーブルビューのタップで画像表示 〜


ついにMOSADeNがウェブで提供され、画像や図版が追加できるようになりました。「百聞は一見にしかず」解説にも大いに役立ちます。また、今回から開発用ツールを、Snow Leoprdに付属しているXcode 3.2に切り替える事にします。

前回は、画像ファイルを保存する処理を解説しました。今回は、テーブルビューに表示されている行をタップすることで、ファイルからJPEG画像を呼び出し、別のビューコントローラに切り替えて表示する処理を解説します。
  

まずは、RootViewControllerにtableView:didSelectRowAtIndexPath:デリゲートを実装します。テーブルビューがタップされると、タップされたテーブルビューのセクション番号(今回はゼロ固定)と行番号(ゼロから始まる)が、indexPath(NSIndexPath)で渡されます。このうち、行番号の方はindexPath.rowで得られます。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
  Model          *model;
  UIImage         *image;
  SymmetryAppDelegate  *app;

  [tableView deselectRowAtIndexPath:indexPath animated:YES];
  // テーブルビューのセレクションを外す
  if( model=[rt_array objectAtIndex:indexPath.row] )// モデル選択
  {
    if( image=[model loadImage] ) // 画像の読み込み
    {
      app=(SymmetryAppDelegate *)[[UIApplication sharedApplication] delegate]; // アプリケーションデリゲート
      [app openImageViewControllerWithImage:image]; // イメージビューをオープン
    }
  }
}

行のセレクション(青色選択表示)を消した後、配列から対象となるモデルを得ます。続いてModelクラスに実装したloadImageメソッドでファイル保存されているJPEG画像をUIImageとして読み込みます。以下が、画像ファイルの読み込みに利用するloadImageメソッドです。前回解説したsaveImageメソッドと逆の処理となります。

- (UIImage *)loadImage
{
  NSString *str,*name,*path;
  UIImage *image;

  str=[NSString stringWithFormat:@"%@-%d",md_name,md_id];
  name=[str stringByAppendingString:@".jpg"]; // 拡張子を追加
  path=getDocumentPath( name ); // ファイルのフルパス名を得る
  image=[[UIImage alloc] initWithContentsOfFile:path]; // ファイル読み込み
  return image;
}

処理の最後には、読み込んだUIImageをopenImageViewControllerWithImage:メソッドに渡しています。このメソッドはSymmetryAppDelegateクラスに実装されており、画像を表示するためのImageViewControllerをNibファイルから呼び出し、カールアップ・アニメーションを使い表示します。

(void)openImageViewControllerWithImage:(UIImage *)image // イメージビュー表示
{
  if( ! ap_imagevctr )
    ap_imagevctr=[[ImageViewController alloc]initWithNibName:@"ImageViewController" bundle:nil]; // Nibファイルから読み込む
  if( ap_imagevctr )
  {
    [UIView beginAnimations:nil context:NULL]; // アニメ開始定義
    [UIView setAnimationDuration:1.0]; // 1秒間のアニメ

    [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:window cache:YES]; // カールアップアニメを実行する
    [window addSubview:ap_imagevctr.view]; // ビュー切り替え
    [UIView commitAnimations]; // アニメ開始

    ap_imagevctr.im_view.image=image; // 画像をUIImageViewへ代入
  }
}
  

このメソッドを実行するには、先んじてInterface BuilderでImageViewController.xibを作成してプロジェクトに登録しておく必要があります。このビューコントローラのビューには、UIImageViewを最大サイズで配置します。最終的には、ここに画像が表示されることになります。このUIImageViewは ImageViewControllerクラスのインスタンス変数im_view(IBOutlet)へリンクされています。

@class ImageViewController;

@interface ImageViewController : UIViewController
{
  IBOutlet UIImageView *im_view; // イメージビュー
}

@property(nonatomic,assign)UIImageView * im_view;

- (void)close;

@end
  

上記がクラス定義のImageViewController.hです、ImageViewController.mには、画像表示を終了させて元のテーブルビューに戻す処理を実装します。以下のcloseメソッドがそれを担当します。

- (void)close // イメージビューを閉じる
{
  UIWindow *window;

  [UIView beginAnimations:nil context:NULL]; // アニメ開始定義
  [UIView setAnimationDuration:1.0]; // 1秒間のアニメ
  window=[UIApplication sharedApplication].keyWindow;
  [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:window cache:YES]; // カールダウンアニメを実行する
  [self.view removeFromSuperview]; // ビューを外す
  [UIView commitAnimations]; // アニメ開始

  self.im_view.image=nil; // UIImageViewの画像を解除
}

この処理を実行するタイミングは、タッチエンドイベントを受け取った時とします。つまり、ImageViewControllerに実装したtouchesEnded:withEvent:メソッド内で実行します。これにより、スクリーンのどこを触っても画像表示は終了することになります。

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event  // タッチ終了
{
  [self close];
}

今回は、単純にファイルとして保存された画像表示しただけです。実際には、この画像を使い「対称処理」行うことになります。次回は、その準備として、ImageViewControllerへの切り替え方法を再考し、各機能ボタンを配置するためのツールバーも配置してみたいと思います。

copyright 2009 Ottimo, Inc. All rights reserved
無断転載・引用禁止