UIScrollView 中 UIImageView 的捏合缩放效果?

15

我正在使用故事板(iOS 6.0)为我的应用程序创建一个照片库查看器。这是我在故事板中设置的imageViewController:

输入图像描述

我已经确保在imageView和scrollView上启用了用户交互和多点触摸。我想做的是,在缩放时,将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;
    }

}

大多数在线问题和教程都涉及通过编程方式创建视图并进行操作,但在我看来,代码越少越好。如何最好地使用Storyboard使其工作?非常感谢您的帮助!!!


更新:

这是我的完整.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

1
我通过你的问题解决了我的疑惑。谢谢。 - Akshit Zaveri
6个回答

32

我认为在苹果文档中有更好的解决方案。

- (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;

}

查看苹果文档


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方法现在可以保持为空。如果您已经这样做了,或者它仍然不起作用,请发布更多的代码,这样更容易提供更具体的帮助。


我已经将委托添加到ImageViewController并将这两种方法添加到我的代码中,但似乎仍无法触发缩放效果。我已更新了我的代码,并感谢您的耐心和帮助! - KingPolygon
当手势识别器触发时,了解这些scrollView方法是否被调用会很有帮助。 - ceekay

1
你需要按照Wadi上面的建议去做,但是还要将setMinimumZoomScale设置为与setMaximumZoomScale不同的值。它们默认都是1.0f。
之后,UIImageView应该可以进行缩放。

0

这里是苹果推荐的实现你想要做的事情的方法。我使用了苹果提供的代码,它非常好用!如果你想要优化内存管理,可以使用iCarousel(由nicklockwood制作),它具有缓存管理功能,可以释放未使用的视图!


谢谢lucaslt89。开发者网站恢复后我一定会看一下(目前显示“维护中”)。这是ScrollView Suite示例代码吗? - KingPolygon
当然,你可以从这里下载WWDC 2010的所有示例:链接 - lucaslt89
请您包含年份和会话编号。您发布的链接无法使用。 - Andrew Theis
这是来自2010年WWDC的“使用滚动视图设计应用程序”会话,以下是所有2010年WWDC视频的链接:https://developer.apple.com/videos/wwdc/2010/。 - lucaslt89

0
我已创建了一个完全可工作的演示应用程序(类似于Facebook默认照片库),演示了使用AutoLayout和故事板嵌套在滚动视图中的Image View的捏合缩放。在此查看我的项目:http://rexstjohn.com/facebook-like-ios-photo-modal-gallery-swipe-gestures/
它还包括通过MKNetworkKit异步加载照片和基于手势的照片库轻扫。希望大家喜欢并且这能节省大家找寻解决方案所需的时间,因为这有些令人烦恼。

0

我创建了一个处理UIImageView缩放的类,类似于Instagram的功能。也许这正是你所需要的,否则你可以查看我是如何实现它的。https://github.com/twomedia/TMImageZoom


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接