15

ストーリーボード (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
4

6 に答える 6

2

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

于 2013-06-02T08:47:13.473 に答える
1

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

その後、UIImageViewピンチ可能にする必要があります

于 2013-11-14T22:07:52.850 に答える
0

Instagram に似た UIImageViews のズームを処理するクラスを作成しました。それ以外の場合は、私がどのようにそれを達成したかを見ることができます。https://github.com/twomedia/TMImageZoom

于 2016-12-06T08:40:55.973 に答える