意外と情報が少なかったんで自分なりに試行錯誤した記録。
自分用のメモなので間違ってたらスマン。
参考にしたサイト。
でんきゾウの備忘録 • UICollectionViewを使ってみる
Single View Applicationでプロジェクト作成。
ボタンとCollection Viewを設置。
セルの中にimage Viewを設置。
参考サイトにならい、UICollectionViewCellを継承してCollectionCellというクラスを作る。
CollectionCell.h
ヘッダファイルは、
#import <UIKit/UIKit.h> @interface CollectionCell : UICollectionViewCell { IBOutlet UIImageView *imageView; } - (void)setImage:(UIImage *)image; @end
メソッドファイルは、
#import "CollectionCell.h" @implementation CollectionCell -(id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialization code } return self; } -(void)setImage:(UIImage *)image { imageView.image = image; } @end
と記述。
ボタンとコレクションビューのプロパティを作成
写真を入れる配列も作成。
#import "ShotViewController.h" #import "CollectionCell.h" NSMutableArray *objects; @interface ShotViewController () @property (weak, nonatomic) IBOutlet UIButton *selectButton; @property (weak, nonatomic) IBOutlet UICollectionView *photoCollectionView; @end
続いてコレクションビューの主要部分
#pragma mark <UICollectionViewDataSource> - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { //#warning Incomplete method implementation -- Return the number of sections //セクションの数。 return 1; } - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { //#warning Incomplete method implementation -- Return the number of items in the section //セルの数 return objects.count; } - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { // Configure the cell CollectionCell *cell = (CollectionCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"Cell"forIndexPath:indexPath]; UIImageView *imageView = cell.contentView.subviews[0]; [imageView setImage:[objects objectAtIndex:indexPath.item]]; return cell; }
この辺はテーブルビューと似てますね。
上記のメソッドを入力したらdetaSourceとdelegateを接続。
セルのidentifierも設定する。
続いて写真を選ぶ行程。
ボタンをアクション接続してそこからカメラロールへ写真を取りに行く。
戻ったら配列に入れてコレクションビューをリロードする。
ピッカーのためのdelegateセット。
#import "ShotViewController.h" #import "CollectionCell.h" NSMutableArray *objects; @interface ShotViewController ()<UIImagePickerControllerDelegate,UINavigationControllerDelegate> @property (weak, nonatomic) IBOutlet UIButton *selectButton; @property (weak, nonatomic) IBOutlet UICollectionView *photoCollectionView; @end
メソッド
#pragma mark 写真を選ぶ - (IBAction)selectShot:(UIButton *)sender { [self cameraRollImagePicker]; } - (void)cameraRollImagePicker { //UIImagePickerのソースの選択。今回はカメラロールから。 UIImagePickerControllerSourceType sourseType = UIImagePickerControllerSourceTypePhotoLibrary; UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.sourceType = sourseType; picker.delegate = self; [self presentViewController:picker animated:YES completion:NULL]; } -(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { //infoに選んだ写真が入っているので取得 UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; //配列の保存 [objects addObject:image]; //戻る処理。 [self dismissViewControllerAnimated:YES completion:nil]; //コレクションビューをリロード [_photoCollectionView reloadData]; }
これでボタンからカメラロールに行って写真を選んで戻ってコレクションビューに入れると言うのが出来た。
全体的なソースはこんな感じ。
#import "ShotViewController.h" #import "CollectionCell.h" NSMutableArray *objects; @interface ShotViewController ()<UIImagePickerControllerDelegate,UINavigationControllerDelegate> @property (weak, nonatomic) IBOutlet UIButton *selectButton; @property (weak, nonatomic) IBOutlet UICollectionView *photoCollectionView; @end @implementation ShotViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. objects = [NSMutableArray array]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } #pragma mark <UICollectionViewDataSource> - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { //#warning Incomplete method implementation -- Return the number of sections //セクションの数。 return 1; } - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { //#warning Incomplete method implementation -- Return the number of items in the section //セルの数 return objects.count; } - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { // UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath]; // Configure the cell CollectionCell *cell = (CollectionCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"Cell"forIndexPath:indexPath]; UIImageView *imageView = cell.contentView.subviews[0]; [imageView setImage:[objects objectAtIndex:indexPath.item]]; return cell; } #pragma mark 写真を選ぶ - (IBAction)selectShot:(UIButton *)sender { [self cameraRollImagePicker]; } - (void)cameraRollImagePicker { //UIImagePickerのソースの選択。今回はカメラロールから。 UIImagePickerControllerSourceType sourseType = UIImagePickerControllerSourceTypePhotoLibrary; UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.sourceType = sourseType; picker.delegate = self; [self presentViewController:picker animated:YES completion:NULL]; } -(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { //infoに選んだ写真が入っているので取得 UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; //配列の保存 [objects addObject:image]; //戻る処理。 [self dismissViewControllerAnimated:YES completion:nil]; //コレクションビューをリロード [_photoCollectionView reloadData]; } @end