UIScrollViewを使って選択した画像をピンチイン・ピンチアウトする方法を説明します。 まずはじめに画像の拡大率・縮小率の限界値を設定します。デフォルトの値がどちらも1.0なので そのままの状態では拡大することができません。scrollViewのデリゲートも適切に設定しておく必要があります。
[scrollView setMinimumZoomScale:1.0]; [scrollView setMaximumZoomScale:5.0]; scrollView.delegate = self;次に、UIImageViewをaddSubviewでUIScrollViewに追加します。まずはじめにimageViewに画像を設定し、その サイズをScrollViewに設定します。その後にimageViewをScrollViewに追加することで画像を拡大・縮小することが出来るようになります。
imageView = [[[UIImageView alloc] initWithImage:image] autorelease]; scrollView.contentSize = CGSizeMake(imageView.frame.size.width, imageView.frame.size.height); [scrollView addSubview:imageView];
最後にデリゲートメソッドを設定します。必ず実装する必要があるメソッドがviewForZoomingInScrollView:です。 このメソッドでは画像を設定したimageViewを返さなければなりません。
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)_scrollView { return imageView; }
その他のデリゲートとして設定しておくと便利なのが下記の3つのメソッドです。scrollViewDidEndDragging:willDecelerate: はドラッグが終了した時に呼ばれるメソッドです(あくまでもドラッグが終了した時点なので、その後画面が慣性で移動した分は 考慮されない・・)scrollViewDidEndDecelerating:は実際に画面が静止したときに呼ばれるメソッドです。最後の scrollViewDidEndZooming:withView:atScale:は画面のズームが終了したときに呼ばれるメソッドです。
- (void)scrollViewDidEndDragging:(UIScrollView *)_scrollView willDecelerate:(BOOL)decelerate { offset.x = _scrollView.contentOffset.x/screenScale; offset.y = _scrollView.contentOffset.y/screenScale; } - (void)scrollViewDidEndDecelerating:(UIScrollView *)_scrollView { offset.x = _scrollView.contentOffset.x/screenScale; offset.y = _scrollView.contentOffset.y/screenScale; } - (void)scrollViewDidEndZooming:(UIScrollView *)_scrollView withView:(UIView *)view atScale:(float)scale { [scrollView setZoomScale:scale+0.01 animated:NO]; [scrollView setZoomScale:scale animated:NO]; screenScale = scale; offset.x = _scrollView.contentOffset.x/screenScale; offset.y = _scrollView.contentOffset.y/screenScale; }
Copyright (C) Kazuma Kitamura All right reserved.