web-dev-qa-db-ja.com

scrollView内のUIImageViewのズーム効果をピンチしますか?

ストーリーボード(iOS 6.0)を使用して、アプリのフォトギャラリービューアを作成しています。これは、ストーリーボードでのimageViewControllerの設定方法です。

enter image description here

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
15
KingPolygon

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;

}

チェックAppleドキュメント

33
Vineesh TP

最初のステップは、ビューに正しいデリゲートが実装されていることを確認することです。たとえば、.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メソッドは、現時点では空のままでかまいません。すでにそれを行った場合、またはそれでも機能しない場合は、コードをもっと投稿してください。そうすれば、より具体的に支援するのが簡単になります。

2
ceekay

Wadiが上で提案したことを行う必要がありますが、setMinimumZoomScaleをsetMaximumZoomScaleとは異なるように設定する必要もあります。デフォルトではどちらも1.0fです。

その後、UIImageViewはピンチ可能になるはずです

1
Nate

Instagramに似たUIImageViewsのズームを処理するクラスを作成しました。あなたが探しているものかもしれませんが、そうでなければ私がそれをどのように達成したかを見ることができます。 https://github.com/twomedia/TMImageZoom

0
Thomas Maw

ここ はどのようにAppleはあなたがやりたいことをすることをお勧めします。私はAppleによって提供されたコードを使用し、それは魅力!メモリ管理を最適化したい場合、 iCarousel (nicklockwood製)を使用できます。これには、未使用のビューの割り当てを解除するためのキャッシュ管理があります。

0
lucaslt89

AutoLayoutとストーリーボードを使用して、スクロールビュー内にネストされたイメージビューをピンチズームするデモを行う、完全に機能するデモアプリケーション(Facebookのデフォルトのフォトギャラリーと本質的に似ています)を作成しました。ここに私のプロジェクトを表示: http://rexstjohn.com/facebook-like-ios-photo-modal-gallery-swipe-gestures/

また、MKNetworkKitを介した写真の非同期読み込み、フォトギャラリーを介したジェスチャーベースのスワイプも含まれます。楽しんでください。やや煩わしいので、これを理解しようとする時間をすべての人が節約できることを願っています。

0
Delete