0

So I Have an AVCamViewController that I am using to take pictures. The background is a live image feed and Overlaid on top is a button to take a picture and a UIImageView to display the picture taken. These both work. I want to have a side scrolling collectionView to display all of the pictures taken but I can't seem to add the collectionView to the overlay View, even though adding the buttons and UIImageView were no problem. Here is the implementation code for the view controller's view did load method:

- (void)viewDidLoad {


_imagesTaken = [[NSMutableArray alloc] init];

_vImagePreview = [[UIView alloc] initWithFrame:self.view.bounds];
_vImage = [[UIImageView alloc] initWithFrame:CGRectMake(50, 50, 50, 50)];

UIButton *shutter = [[UIButton alloc] initWithFrame:CGRectMake(100,500,50,50)];
[shutter addTarget:self action:@selector(takePicture) forControlEvents:UIControlEventTouchUpInside];
[shutter setBackgroundColor:[UIColor greenColor]];

[_vImagePreview addSubview:shutter];
[_vImagePreview addSubview:_vImage];



UICollectionViewFlowLayout *layout=[[UICollectionViewFlowLayout alloc] init];
[layout setItemSize:CGSizeMake(50, 50)];

_collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(10, 400, 315, 60) collectionViewLayout:layout];
_collectionView.backgroundColor = [UIColor redColor];
_collectionView.pagingEnabled = YES;
_collectionView.delegate = self;
_collectionView.dataSource = self;
//[_collectionView setDataSource:self];
//[_collectionView setDelegate:self];

[_collectionView registerClass:[PhotoCell class] forCellWithReuseIdentifier:@"cellIdentifier"];

[_vImagePreview addSubview:_collectionView];
[_collectionView reloadData];

[self.view addSubview:_vImagePreview];

[super viewDidLoad];

AVCaptureSession *session = [[AVCaptureSession alloc] init];
session.sessionPreset = AVCaptureSessionPresetMedium;

//CALayer *viewLayer = self.vImagePreview.layer;
//NSLog(@"viewLayer = %@", viewLayer);

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

captureVideoPreviewLayer.frame = self.vImagePreview.bounds;
[self.vImagePreview.layer addSublayer:captureVideoPreviewLayer];

AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

NSError *error = nil;
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
if (!input) {
    // Handle the error appropriately.
    NSLog(@"ERROR: trying to open camera: %@", error);
}
[session addInput:input];

_stillImageOutput = [[AVCaptureStillImageOutput alloc] init];
NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys: AVVideoCodecJPEG, AVVideoCodecKey, nil];
[_stillImageOutput setOutputSettings:outputSettings];
[session addOutput:_stillImageOutput];

[session startRunning];

}

Any Ideas why the button and UIImageView show up but the collectionView doesn't?

Here is my header file:

#import <UIKit/UIKit.h>
#import "CaptureSessionManager.h"

@interface AVOverlayViewController : UIViewController <UICollectionViewDataSource,UICollectionViewDelegateFlowLayout>

@property (retain) CaptureSessionManager *captureManager;
@property (nonatomic, strong) UILabel *scanningLabel;
@property (nonatomic, strong) NSMutableArray *imagesTaken;

@property(nonatomic, retain) AVCaptureStillImageOutput *stillImageOutput;
@property(nonatomic, retain) IBOutlet UIView *vImagePreview;
@property(nonatomic, retain) IBOutlet UIImageView *vImage;
@property (nonatomic, retain) IBOutlet UICollectionView *collectionView;



@end

Also, these are the delegate methods I am calling in the ViewController's implementation file:

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
    return [_imagesTaken count];
    NSLog(@"%d added to collection view",[_imagesTaken count]);
}


    - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{

        PhotoCell *cell=[collectionView dequeueReusableCellWithReuseIdentifier:@"PhotoCellIdentifier" forIndexPath:indexPath];

        UIImage *fromCamera = [_imagesTaken objectAtIndex:indexPath.row];

        [[cell imageView] setImage:fromCamera];

        cell.backgroundColor=[UIColor greenColor];

        return cell;
    }

Both of these delegate methods are never being called. Any help is much appreciated! Thanks!

1 Answers1

0

Is there a reason the collectionView is an @property? Why not implement something like:

@interface AVOverlayViewController : UIViewController <UICollectionViewDataSource,UICollectionViewDelegateFlowLayout>
{
    UICollectionView *collectionView;
}

If that doesn't help, you could try (instead of setting the size in viewDidLoad) implementing - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath in the delegate.

I'd also say start small, just load in cells first and see if you can get that to work. Then once you're sure the collection is implemented properly, add the images you want. I'd start with just loading blank green cells in, and maybe set the background color of the collection view to something noticeable.

kwdev
  • 116
  • 1
  • 5
  • No specific reason that collectionView is an @property. The collectionView isn't even displaying. I also have this problem when I try to add a custom UIView as a subview to _vImagePreview. Anytime that I add a view that has it's own subviews to _vImagePreview it doesn't work. Should I just put everything from the overlay into a Nib and call -loadNibNamed? It seems the problem is I can't add any subviews that have their own subviews. Thank you for the response – Eric Schlanger Nov 07 '13 at 04:16