cappuccinoのコンピタブログ

cappmac.exblog.jp
ブログトップ

タグ:サンプルコード ( 1 ) タグの人気記事

ViewDidLoad内の処理をメソッド化する

サンプルコードは単一の機能を説明する上で、簡単化したいため、ViewDidLoad内に直接描かれていることが多いです。
そのため、まとまった機能は部品化していきたいため、メソッド化してしまいましょう。

例として以下のソースコードを変更してみます。

https://www.cocoacontrols.com/controls/lmgeocoder

LMGeocoderという、ジオコーディングを簡単化するコントロールのソースコードです。

この中の、LMGeocoderDemoプロジェクトを開いてみます。

実行すると、映像に合わせて、緯度、経度、ジオコードした結果(住所、道路名)が表示されます。

以下のような感じ。
c0064553_17421606.png
ちなみに映像に対して、文字が縦のままなのはHorizontal専用のレイアウトだからです。
レイアウトの調整もそのうち手を付けていきたいですが、とりあえず今日の本題はそのコードの内容について。

ソースコードは以下のファイルで構成されています。
c0064553_18150996.png
このうち、AppDelegate.mとLMViewController.mが、このコードの主要部分となります。

[AppDelegate.m]
特にいじりません。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

メソッドの中で初期化処理が行われております。


[LMViewController.m]

- (void)viewDidLoad

メソッドの中でビューのライフサイクルが動作しています。語弊は有りますが、main関数みたいなものです。

この中で位置情報を取得する処理は、部品化されています。


一方、ビデオを表示する処理は、ベタに書かれています。AVFoundationを使った簡潔なコードなので、このまま部品化して呼び出せるようにまとめておこうと思います。


とりあえず、メソッド化してみます。


返却値も、引数も無いので、以下の関数(videoLayer)を作って処理をコピペしました。{}内はviewDidLoad内のコードをそのまま移植しただけです。


- (void)videoLayer

{

BOOL hasCamera = ([[AVCaptureDevice devices] count] > 0);

if (hasCamera) {

AVCaptureSession *session = [[AVCaptureSession alloc] init];

session.sessionPreset = AVCaptureSessionPresetHigh;

AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];

[captureVideoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];

[captureVideoPreviewLayer setFrame:self.backgroundImageView.bounds];

[self.backgroundImageView.layer addSublayer:captureVideoPreviewLayer];

AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

NSError *error = nil;

AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];

[session addInput:input];

[session startRunning];

}

else {

self.backgroundImageView.image = [UIImage imageNamed:@"background"];

}

}


幸い、スコープはメソッド内で閉じているので、変更はいっさい不要でした(ビデオを表示するだけだしね)。

これでメソッドは作成できたので、あとはviewDidLoadで呼び出せるよう、コードを追加します。
自分の中のメソッドを呼び出すだけなので、以下を追加するだけです。ドットでもかけますが、Objective-Cらしくメッセージで。

[self videoLayer];


この部品は後々、ビューの中で表示するビデオを実現するコードとして利用したいと思います。

今回は改変しても壊れないこと、および見通しを良くすることに主眼を置いたので、自分のやりきった感は少ないですが、実行結果は映像があったり、位置情報が変化したりと見栄えがするので面白いと思います。

今後も、見た目重視のアプリをいろいろいじっていこうと思います。

[PR]
by cappuccino_mac | 2014-06-29 17:06 | 開発メモ