iosobjective-cuicollectionviewcellgesturepinch

is possible to zoom in/out a UIImageView in custom cell of a UICollectionView only when pinch the cell's imageView?


I have a CollectionView that have one custom cell.

I want to zoom in/out imageView in cell, so i add pinch gesture at CollectionView.m

when i add gesture to self.collectionView, like this:

[self.collectionView addGestureRecognizer:pinchGesture];

it works! my cell.imageView can zoom in/out, but when i pinch other place(not in cell's imageView, my cell.imageView still zoom in/out with the gesture, I want the cell.imageView zoom in/out just when user pinch the cell.imageView, so i try to add gesture use this code:

[cell.imageView addGestureRecognizer:pinchGesture];

but unfortunately it doesn't work. Nothing happen when i pinch the cell's imageView.

so my question is, is possible to zoom in/out the cell's imageView only when user pinch the cell's imageView? not other place.


Solution

  • enter image description hereCollection view cell

    //cell.h
    
    #import <UIKit/UIKit.h>
    
    @interface Cell : UICollectionViewCell
    
    @property (weak, nonatomic) IBOutlet UIScrollView *scrollview;
    @property (weak, nonatomic) IBOutlet UIImageView *imageview;
    
    - (void)setup;
    
    @end
    
    
    //cell.m
    
    #import "Cell.h"
    #define MAXIMUM_SCALE 3.0
    #define MINIMUM_SCALE    1.0
    
    @interface Cell()<UIScrollViewDelegate>
    
    @end
    
    @implementation Cell
    
    - (void)setup {
    
        UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(zoomImage:)];
        self.imageview.gestureRecognizers = @[pinch];
        self.imageview.userInteractionEnabled = YES;
        self.scrollview.delegate = self;
    
    }
    
    //-----------------------------------------------------------------------
    
    #pragma  mark  - Scrollview Delegate Method
    
    - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
        return self.imageview;
    }
    
    //-----------------------------------------------------------------------
    
    #pragma mark - Custom Methods
    
    - (void)zoomImage:(UIPinchGestureRecognizer *)gesture {
        if (gesture.state == UIGestureRecognizerStateEnded
        || gesture.state == UIGestureRecognizerStateChanged) {
            NSLog(@"gesture.scale = %f", gesture.scale);
    
            CGFloat currentScale = self.frame.size.width / self.bounds.size.width;
            CGFloat newScale = currentScale * gesture.scale;
    
            if (newScale < MINIMUM_SCALE) {
                newScale = MINIMUM_SCALE;
            }
            if (newScale > MAXIMUM_SCALE) {
                newScale = MAXIMUM_SCALE;
            }
    
            CGAffineTransform transform = CGAffineTransformMakeScale(newScale, newScale);
            self.imageview.transform = transform;
            self.scrollview.contentSize = self.imageview.frame.size;
    
        }
    
    }
    
    @end
    

    ViewController files

    //ViewController.h
    
    #import <UIKit/UIKit.h>
    
    @interface ViewController : UIViewController
    
    
    @end
    
    
    
    //ViewController.m[![enter image description here][1]][1]
    
    
    #import "ViewController.h"
    #import "Cell.h"
    
    @interface ViewController ()<UICollectionViewDataSource, UICollectionViewDelegate>
    
    @property (weak, nonatomic) IBOutlet UICollectionView *collectionView;
    @property (strong, nonatomic) NSArray  *imageArray;
    
    @end
    
    @implementation ViewController
    
    //-----------------------------------------------------------------------
    
    #pragma mark - Collectionview Datasource Methods
    
    //-----------------------------------------------------------------------
    
    - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    return self.imageArray.count;
    }
    
    //-----------------------------------------------------------------------
    
    - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    
        Cell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
        [cell setup];
        cell.imageview.image = [UIImage imageNamed:[self.imageArray objectAtIndex:indexPath.row]];
        return cell;
    }
    
    //-----------------------------------------------------------------------
    
    #pragma mark - Lifecycle method
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        _imageArray = @[ @"1.jpg", @"1.jpg" ];
        self.collectionView.dataSource = self;
        self.collectionView.delegate = self;
    
    }
    
    //-----------------------------------------------------------------------
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    @end
    

    Note : You need to create an IBOutlet for scrollview, image view and collection view from storyboard.