iOS写真アプリによくある画像の切り取りViewを作ってみた

Instagramなどの写真系アプリで、ギャラリーで写真を選択した後出てくる枠にはめ込んでトリミングするビューを作ってみました。

それ、UIKitでできるよ

UIImagePickerControllerを使うと、インスタンスのプロパティを設定するだけでギャラリーで画像を選択したあと、UIKitで用意されている切り取り画面に遷移します。

void showPicker {
    UIImagePickerController *controller = [[UIImagePickerController alloc] init];
    controller.allowsEditing = YES;
    [self.navigationController pushViewController:controller animated:YES];
}


ただし、Pickerを使わずカメラロール以外のソースから画像を読み込みたいときなどは、独自のクラスで処理をしてあげないといけません。

作ってみた

ということでカスタムクラスを1から書いてみました。ソースはhorimislime/iTrimmingView · GitHubより。 呼び出しは以下のような感じです。

// TrimmingViewControllerDelegateを実装したクラス内
- (void) showPicker {
	// 呼び出し側のViewController内
	TrimmingViewController *trimmingViewController = [[TrimmingViewController alloc] initWithNibName:@"TrimmingViewController" bundle:nil];

	// 切り取りたい画像のUIImage
	trimmingViewController.image = [UIImage imageNamed:@"hogehoge.png"];
	//切り取りボタンが押された際に呼ばれるDelegate
	trimmingViewController.delegate = self;

	[self pushViewController:trimmingViewController animated:YES];
}

- (void) trimmingController: (TrimmingViewController *) sender finished: (UIImage *) image {
  // 切り取った画像の処理...
}


Pickerと同じように、呼び出し側でDelegateを実装しておき切り取ったUIImageを受け取ります。Pickerを使わないアプリに組み込みたいとき以外にも、切り取り画面の見た目をこまかく弄りたいときにも使えそう。