在自定义UICollectionViewcell中缩放Imageview

时间:2014-08-27 05:56:26

标签: ios objective-c iphone uiscrollview zoom

缩放自定义UIImageView中的UICollectionViewCell时,整个单元格都会缩放。我希望UIImageView能够像在iPhone照片中的照片库中一样进行缩放。

#define widthOfBlackTransVw 30
 #define ZOOM_STEP 2.0

@implementation DetailedImageCell

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {

        self.scrollView = [UIScrollView new];
        self.scrollView.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
        self.scrollView.delegate = self;
        self.scrollView.userInteractionEnabled  = YES;
        self.scrollView.bouncesZoom = YES;
        [self addSubview:self.scrollView];

        self.imageView = [UIImageView new];
        self.imageView.frame = self.scrollView.frame;
        self.imageView.userInteractionEnabled = YES;
        self.imageView.clipsToBounds = YES;
        [self.scrollView addSubview:self.imageView];


        UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
        UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)];
        UITapGestureRecognizer *twoFingerTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTwoFingerTap:)];

        [singleTap setNumberOfTapsRequired:1];
        [doubleTap setNumberOfTapsRequired:2];
        [twoFingerTap setNumberOfTouchesRequired:2];

        //Adding gesture recognizer
        [self.imageView addGestureRecognizer:singleTap];
        [self.imageView addGestureRecognizer:doubleTap];
        [self.imageView addGestureRecognizer:twoFingerTap];
        [singleTap requireGestureRecognizerToFail:doubleTap];


        float minimumScale = 1.0;
        self.scrollView.maximumZoomScale = 6.0;
        self.scrollView.minimumZoomScale = minimumScale;
        self.scrollView.zoomScale = minimumScale;
        [self.imageView setContentMode:UIViewContentModeScaleAspectFit];
        [self.scrollView setContentSize:self.imageView.bounds.size];
    }
    return self;
}

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return self.imageView;
}

- (void)scrollViewDidZoom:(UIScrollView *)aScrollView
{
    CGFloat offsetX = (self.scrollView.bounds.size.width > self.scrollView.contentSize.width)?
    (self.scrollView.bounds.size.width - self.scrollView.contentSize.width) * 0.5 : 0.0;
    CGFloat offsetY = (self.scrollView.bounds.size.height > self.scrollView.contentSize.height)?
    (self.scrollView.bounds.size.height - self.scrollView.contentSize.height) * 0.5 : 0.0;
    self.imageView.center = CGPointMake(self.scrollView.contentSize.width * 0.5 + offsetX,
                                   self.scrollView.contentSize.height * 0.5 + offsetY);


}  
- (void)handleDoubleTap:(UIGestureRecognizer *)gestureRecognizer {
    // zoom in
    float newScale = [self.scrollView zoomScale] * ZOOM_STEP;

    if (newScale > self.scrollView.maximumZoomScale){

        newScale = self.scrollView.minimumZoomScale;
        CGRect zoomRect = [self zoomRectForScale:newScale withCenter:[gestureRecognizer locationInView:gestureRecognizer.view]];

        [self.scrollView zoomToRect:zoomRect animated:YES];
    }
    else{

        newScale = self.scrollView.maximumZoomScale;
        CGRect zoomRect = [self zoomRectForScale:newScale withCenter:[gestureRecognizer locationInView:gestureRecognizer.view]];

        [self.scrollView zoomToRect:zoomRect animated:YES];
        }
}

- (void)handleTwoFingerTap:(UIGestureRecognizer *)gestureRecognizer
 {
    float newScale = [self.scrollView zoomScale] / ZOOM_STEP;
    CGRect zoomRect = [self zoomRectForScale:newScale withCenter:[gestureRecognizer locationInView:gestureRecognizer.view]];
    [self.scrollView zoomToRect:zoomRect animated:YES];

}
- (CGRect)zoomRectForScale:(float)scale withCenter:(CGPoint)center {

    CGRect zoomRect;

    // the zoom rect is in the content view's coordinates.
    //    At a zoom scale of 1.0, it would be the size of the self.scrollView's bounds.
    //    As the zoom scale decreases, so more content is visible, the size of the rect grows.
    zoomRect.size.height = [self.scrollView frame].size.height / scale;
    zoomRect.size.width  = [self.scrollView frame].size.width  / scale;

    // choose an origin so as to get the right center.
    zoomRect.origin.x    = center.x - (zoomRect.size.width  / 2.0);
    zoomRect.origin.y    = center.y - (zoomRect.size.height / 2.0);

    return zoomRect;
}

单元格额外空间与UIImage一起缩放。我只需要缩放UIImageView

0 个答案:

没有答案