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

32

我认为 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;

}

检查苹果文档

于 2013-12-02T05:46:55.420 回答
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

我创建了一个完整的演示应用程序(本质上类似于 Facebook 的默认照片库),它演示了缩放嵌套在带有 AutoLayout 和情节提要的滚动视图中的图像视图。在此处查看我的项目:http ://rexstjohn.com/facebook-like-ios-photo-modal-gallery-swipe-gestures/ 。

它还包括通过 MKNetworkKit 的异步照片加载和基于手势的照片库滑动。享受吧,我希望它可以节省每个人试图弄清楚这一点的时间,因为这有点烦人。

于 2013-12-25T05:56:01.980 回答
0

以下是 Apple 建议您做您想做的事情的方法。我使用了 Apple 提供的代码,它就像一个魅力!如果你想优化内存管理,你可以使用iCarousel(由nicklockwood 制作),它对dealloc 未使用的视图有一个缓存管理!

于 2013-06-01T23:57:02.440 回答
0

我创建了一个类来处理类似于 Instagram 的 UIImageViews 的缩放。可能是你正在寻找的,否则你可以看看我是如何实现它的。https://github.com/twomedia/TMImageZoom

于 2016-12-06T08:40:55.973 回答