ストーリーボード(iOS 6.0)を使用して、アプリのフォトギャラリービューアを作成しています。これは、ストーリーボードでのimageViewControllerの設定方法です。
ImageViewとscrollViewの両方でuserInteractionと複数のタッチを有効にするようにしました。私がやりたいのは、ピンチでimageView(最大スケール3)にズームインして、パンできるようにすることです。これは私が現在持っているものですが、ピンチジェスチャーが検出されても、スケールは変わりません。
- (IBAction)imagePinched:(id)sender {
if (pinchRecognizer.state == UIGestureRecognizerStateEnded || pinchRecognizer.state == UIGestureRecognizerStateChanged) {
NSLog(@"gesture.scale = %f", pinchRecognizer.scale);
CGFloat currentScale = self.fullScreenView.frame.size.width / self.fullScreenView.bounds.size.width;
CGFloat newScale = currentScale * pinchRecognizer.scale;
if (newScale < 1) {
newScale = 1;
}
if (newScale > 3) {
newScale = 3;
}
CGAffineTransform transform = CGAffineTransformMakeScale(newScale, newScale);
self.fullScreenView.transform = transform;
pinchRecognizer.scale = 1;
}
}
オンラインでのほとんどの質問とチュートリアルは、プログラムでビューを作成してこれを行うことを扱っていますが、コードが少ないほど(私の目では)優れています。これをストーリーボードで機能させる最良の方法は何ですか?前もって感謝します!!!
更新:
これが私の完全な.mファイルコードです:
- (void)viewDidLoad
{
[super viewDidLoad];
//Assign an image to this controller's imageView
fullScreenView.image = [UIImage imageNamed:imageString];
//Allows single and double tap to work
[singleTapRecognizer requireGestureRecognizerToFail: doubleTapRecognizer];
}
- (IBAction)imageTapped:(id)sender {
NSLog(@"Image Tapped.");
//On tap, fade out viewController like the Twitter.app
[self dismissViewControllerAnimated:YES completion:nil];
}
- (IBAction)imageDoubleTapped:(id)sender {
NSLog(@"Image Double Tapped.");
//On double tap zoom into imageView to fill in the screen.
[fullScreenView setContentMode:UIViewContentModeScaleAspectFill];
}
- (IBAction)imagePinched:(id)sender {
if (pinchRecognizer.state == UIGestureRecognizerStateEnded || pinchRecognizer.state == UIGestureRecognizerStateChanged) {
NSLog(@"gesture.scale = %f", pinchRecognizer.scale);
CGFloat currentScale = self.fullScreenView.frame.size.width / self.fullScreenView.bounds.size.width;
CGFloat newScale = currentScale * pinchRecognizer.scale;
if (newScale < 1) {
newScale = 1;
}
if (newScale > 3) {
newScale = 3;
}
CGAffineTransform transform = CGAffineTransformMakeScale(newScale, newScale);
self.fullScreenView.transform = transform;
pinchRecognizer.scale = 1;
}
}
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
return self.fullScreenView;
}
-(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale {
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
Appleドキュメントでより良い解決策と思います
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
return self.imageView;
}
- (void)viewDidLoad {
[super viewDidLoad];
self.scrollView.minimumZoomScale=0.5;
self.scrollView.maximumZoomScale=6.0;
self.scrollView.contentSize=CGSizeMake(1280, 960);
self.scrollView.delegate=self;
}
最初のステップは、ビューに正しいデリゲートが実装されていることを確認することです。たとえば、.mファイル
@interface myRootViewController () <.., UIGestureRecognizerDelegate, UIScrollViewDelegate, ...>
ドキュメントから、これが実装されていることを確認してください:
UIScrollViewクラスには、UIScrollViewDelegateプロトコルを採用する必要があるデリゲートを含めることができます。ズームとパンが機能するには、デリゲートがviewForZoomingInScrollView:とscrollViewDidEndZooming:withView:atScale:;の両方を実装する必要があります。さらに、最大(maximumZoomScale)と最小(minimumZoomScale)のズームスケールは異なる必要があります。
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
return self.fullScreenView;
}
-(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale
{}
ScrollViewDidEndZoomingメソッドは、現時点では空のままでかまいません。すでにそれを行った場合、またはそれでも機能しない場合は、コードをもっと投稿してください。そうすれば、より具体的に支援するのが簡単になります。
Wadiが上で提案したことを行う必要がありますが、setMinimumZoomScaleをsetMaximumZoomScaleとは異なるように設定する必要もあります。デフォルトではどちらも1.0fです。
その後、UIImageView
はピンチ可能になるはずです
Instagramに似たUIImageViewsのズームを処理するクラスを作成しました。あなたが探しているものかもしれませんが、そうでなければ私がそれをどのように達成したかを見ることができます。 https://github.com/twomedia/TMImageZoom
AutoLayoutとストーリーボードを使用して、スクロールビュー内にネストされたイメージビューをピンチズームするデモを行う、完全に機能するデモアプリケーション(Facebookのデフォルトのフォトギャラリーと本質的に似ています)を作成しました。ここに私のプロジェクトを表示: http://rexstjohn.com/facebook-like-ios-photo-modal-gallery-swipe-gestures/ 。
また、MKNetworkKitを介した写真の非同期読み込み、フォトギャラリーを介したジェスチャーベースのスワイプも含まれます。楽しんでください。やや煩わしいので、これを理解しようとする時間をすべての人が節約できることを願っています。