2011-07-02 33 views
0

このコードを使用して、スクロールビューで画像を拡大/縮小します。しかし、ズームインが機能していないため、何が間違っているのか分かりません。スクロールビューで画像を拡大/縮小する

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; 
} 

上記のコードでは、どのようにズーム画像をスクロールできますか?

答えて

0

ピンチジェスチャ認識機能を使用してズームイン/ズームアウトすることができます。 1は自分のコード内のイメージのために優れている

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

+0

:次のリンクをチェックしてください! – ram

+0

ImageViewでピンチレコグナイザを実装する方が良いと思いますが、私はそれが最も簡単な方法だと思っています... – iMOBDEV

+0

FacebookやGmailのアカウントをお持ちですか? – ram

関連する問題