在滚动视图中放大和缩小图像

时间:2011-07-02 09:37:02

标签: iphone objective-c cocoa-touch

我在滚动视图中使用此代码放大和缩小图像。但我不知道出了什么问题,因为放大不起作用?

    const CGFloat kScrollObjHeight    = 460.0;
    const CGFloat kScrollObjWidth    = 320.0;
    const NSUInteger kNumImages        = 32;

    - (void)layoutScrollImages
    {
        UIImageView *view = nil;
        NSArray *subviews = [scrollView1 subviews];

        // reposition all image subviews in a horizontal serial fashion
        CGFloat curXLoc = 0;
        for (view in subviews)
        {
            if ([view isKindOfClass:[UIImageView class]] && view.tag > 0)
            {
                CGRect frame = view.frame;
                frame.origin = CGPointMake(curXLoc, 0);
                view.frame = frame;

                curXLoc += (kScrollObjWidth);
            }
        }

        // set the content size so it can be scrollable
        [scrollView1 setContentSize:CGSizeMake((kNumImages * kScrollObjWidth), [scrollView1 bounds].size.height)];
    }

    - (void)viewDidLoad
    {
        self.view.backgroundColor = [UIColor viewFlipsideBackgroundColor];

        // 1. setup the scrollview for multiple images and add it to the view controller
        //
        // note: the following can be done in Interface Builder, but we show this in code for clarity
        [scrollView1 setBackgroundColor:[UIColor blackColor]];
        [scrollView1 setCanCancelContentTouches:NO];
        scrollView1.indicatorStyle = UIScrollViewIndicatorStyleWhite;
        scrollView1.clipsToBounds = YES;        // default is NO, we want to restrict drawing within our scrollview
        scrollView1.scrollEnabled = YES;

        //imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image0.jpg"]];
        [scrollView1 addSubview:imageView];
        [scrollView1 setContentSize:CGSizeMake(imageView.frame.size.width, imageView.frame.size.height)];
        scrollView1.minimumZoomScale = 1;
        scrollView1.maximumZoomScale = 3;
        scrollView1.delegate = self;
        [scrollView1 setScrollEnabled:YES];

        // pagingEnabled property default is NO, if set the scroller will stop or snap at each photo
        // if you want free-flowing scroll, don't set this property.
        scrollView1.pagingEnabled = YES;

        // load all the images from our bundle and add them to the scroll view
        NSUInteger i;
        for (i = 1; i <= kNumImages; i++)
        {
            NSString *imageName = [NSString stringWithFormat:@"page-%d.jpg", i];
            UIImage *image = [UIImage imageNamed:imageName];
            UIImageView *ImageView = [[UIImageView alloc] initWithImage:image];

            // setup each frame to a default height and width, it will be properly placed when we call "updateScrollList" 
            CGRect rect = ImageView.frame;
            rect.size.height = kScrollObjHeight;
            rect.size.width = kScrollObjWidth;
            ImageView.frame = rect;
            ImageView.tag = i;    // tag our images for later use when we place them in serial fashion
            [scrollView1 addSubview:ImageView];
            [ImageView release];
        }

        [self layoutScrollImages];    // now place the photos in serial layout within the scrollview


    }

    -(UIView *) viewForZoomingInScrollView:(UIScrollView *)scrollView {
        return imageView;
    }
how add below code for zooming with above code?
#define ZOOM_VIEW_TAG 100
#define ZOOM_STEP 1.5


@interface RootViewController (UtilityMethods)
- (CGRect)zoomRectForScale:(float)scale withCenter:(CGPoint)center;
@end


@implementation RootViewController

@synthesize imageScrollView, imageView;

- (void)loadView {
    [super loadView];

    // set the tag for the image view
    [imageView setTag:ZOOM_VIEW_TAG];

    // add gesture recognizers to the image view
    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:)];

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

    [imageView addGestureRecognizer:singleTap];
    [imageView addGestureRecognizer:doubleTap];
    [imageView addGestureRecognizer:twoFingerTap];

    [singleTap release];
    [doubleTap release];
    [twoFingerTap release];

    // calculate minimum scale to perfectly fit image width, and begin at that scale
    float minimumScale = [imageScrollView frame].size.width  / [imageView frame].size.width;
    [imageScrollView setMinimumZoomScale:minimumScale];
    [imageScrollView setZoomScale:minimumScale];
}


- (void)viewDidUnload {
    self.imageScrollView = nil;
    self.imageView = nil;
}


- (void)dealloc {
    [imageScrollView release];
    [imageView release];
    [super dealloc];
}

#pragma mark UIScrollViewDelegate methods

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
    return [imageScrollView viewWithTag:ZOOM_VIEW_TAG];
}

/************************************** NOTE **************************************/
/* The following delegate method works around a known bug in zoomToRect:animated: */
/* In the next release after 3.0 this workaround will no longer be necessary      */
/**********************************************************************************/
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale {
    [scrollView setZoomScale:scale+0.01 animated:NO];
    [scrollView setZoomScale:scale animated:NO];
}

#pragma mark TapDetectingImageViewDelegate methods

- (void)handleSingleTap:(UIGestureRecognizer *)gestureRecognizer {
    // single tap does nothing for now
}

- (void)handleDoubleTap:(UIGestureRecognizer *)gestureRecognizer {
    // double tap zooms in
    float newScale = [imageScrollView zoomScale] * ZOOM_STEP;
    CGRect zoomRect = [self zoomRectForScale:newScale withCenter:[gestureRecognizer locationInView:gestureRecognizer.view]];
    [imageScrollView zoomToRect:zoomRect animated:YES];
}

- (void)handleTwoFingerTap:(UIGestureRecognizer *)gestureRecognizer {
    // two-finger tap zooms out
    float newScale = [imageScrollView zoomScale] / ZOOM_STEP;
    CGRect zoomRect = [self zoomRectForScale:newScale withCenter:[gestureRecognizer locationInView:gestureRecognizer.view]];
    [imageScrollView zoomToRect:zoomRect animated:YES];
}

#pragma mark Utility methods

- (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 imageScrollView's bounds.
    //    As the zoom scale decreases, so more content is visible, the size of the rect grows.
    zoomRect.size.height = [imageScrollView frame].size.height / scale;
    zoomRect.size.width  = [imageScrollView 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;
}

在上面的代码中如何在滚动视图中缩放图像?

1 个答案:

答案 0 :(得分:0)

您可以使用捏合手势识别器进行放大/缩小。请检查以下链接:

How can I use pinch zoom(UIPinchGestureRecognizer) to change width of a UITextView?