【问题标题】:Pinch Zoom on Two ImageViews in Single ScrollView on IOS在 IOS 上的单个 ScrollView 中捏缩放两个 ImageView
【发布时间】:2016-12-18 16:18:08
【问题描述】:

我正在做一个项目,其中我需要两个带有缩放选项的 Scrollview 中的图像视图。 UIScrollView 允许一个视图轻松进行缩放。但我的问题不是这样的。我在滚动视图中有两个并排的图像视图。当我尝试缩放图像时它不起作用是否有任何选项可以同时缩放两个图像视图。请给我一些建议。

提前致谢

【问题讨论】:

  • 所以你的问题是当你缩放时,你的两个图像应该是缩放的......我是对的吗???
  • 我认为你应该在一个视图中添加两个图像视图,并且在 viewForZooming 方法中你应该返回那个视图
  • 将您的UIImageViews 放在两个单独的UIScrollView 中,并将这些UIScrollView 放在您的UIScrollView 中,并为它们设置标签,并使用代理将其放大,就像后面提到的@Sunnyshah检查UIScrollView 的标签。希望它会奏效。
  • 是的,我只是这样做了,但它不起作用

标签: iphone ios uiscrollview pinchzoom


【解决方案1】:

这是在单个滚动视图中缩放两个图像的代码

我在一个UIView 中添加了两个UIImageView,然后我将UIView 添加到UIScrollView。以下是我的代码:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.vwImages = [[UIView alloc]initWithFrame:CGRectMake(0, 0,100,200)];

    // 1
    UIImage *image = [UIImage imageNamed:@"imgBaskteBall2.jpeg"];
    UIImageView *imageView1 = [[UIImageView alloc] initWithImage:image];
    imageView1.frame = CGRectMake(0,0,100,100);
    [self.vwImages addSubview:imageView1];

    UIImage *image2 = [UIImage imageNamed:@"imgBaskteBall1.jpeg"];
    UIImageView *imageView2 = [[UIImageView alloc] initWithImage:image2];
    imageView2.frame = CGRectMake(0, 100, 100, 100);
    [self.vwImages  addSubview:imageView2];

    // 2

    [self.scrollView addSubview:self.vwImages];

    self.scrollView.contentSize = self.vwImages.frame.size;

    // 3
    UITapGestureRecognizer *doubleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(scrollViewDoubleTapped:)];
    doubleTapRecognizer.numberOfTapsRequired = 2;
    doubleTapRecognizer.numberOfTouchesRequired = 1;
    [self.scrollView addGestureRecognizer:doubleTapRecognizer];

    UITapGestureRecognizer *twoFingerTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(scrollViewTwoFingerTapped:)];
    twoFingerTapRecognizer.numberOfTapsRequired = 1;
    twoFingerTapRecognizer.numberOfTouchesRequired = 2;
    [self.scrollView addGestureRecognizer:twoFingerTapRecognizer];
}


- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    // 4
    CGRect scrollViewFrame = self.scrollView.frame;
    CGFloat scaleWidth = scrollViewFrame.size.width / self.scrollView.contentSize.width;
    CGFloat scaleHeight = scrollViewFrame.size.height / self.scrollView.contentSize.height;
    CGFloat minScale = MIN(scaleWidth, scaleHeight);
    self.scrollView.minimumZoomScale = minScale;

    // 5
    self.scrollView.maximumZoomScale = 10.0f;
    self.scrollView.zoomScale = minScale;

    // 6
    [self centerScrollViewContents];
}


- (void)centerScrollViewContents {
    CGSize boundsSize = self.scrollView.bounds.size;
    CGRect contentsFrame = self.vwImages.frame;

    if (contentsFrame.size.width < boundsSize.width) {
        contentsFrame.origin.x = (boundsSize.width - contentsFrame.size.width) / 2.0f;
    } else {
        contentsFrame.origin.x = 0.0f;
    }

    if (contentsFrame.size.height < boundsSize.height) {
        contentsFrame.origin.y = (boundsSize.height - contentsFrame.size.height) / 2.0f;
    } else {
        contentsFrame.origin.y = 0.0f;
    }

    self.vwImages.frame = contentsFrame;
}

- (void)scrollViewDoubleTapped:(UITapGestureRecognizer*)recognizer {
    // 1
    CGPoint pointInView = [recognizer locationInView:self.imageView];

    // 2
    CGFloat newZoomScale = self.scrollView.zoomScale * 1.5f;
    newZoomScale = MIN(newZoomScale, self.scrollView.maximumZoomScale);

    // 3
    CGSize scrollViewSize = self.scrollView.bounds.size;

    CGFloat w = scrollViewSize.width / newZoomScale;
    CGFloat h = scrollViewSize.height / newZoomScale;
    CGFloat x = pointInView.x - (w / 2.0f);
    CGFloat y = pointInView.y - (h / 2.0f);

    CGRect rectToZoomTo = CGRectMake(x, y, w, h);

    // 4
    [self.scrollView zoomToRect:rectToZoomTo animated:YES];
}

- (void)scrollViewTwoFingerTapped:(UITapGestureRecognizer*)recognizer {
    // Zoom out slightly, capping at the minimum zoom scale specified by the scroll view
    CGFloat newZoomScale = self.scrollView.zoomScale / 1.5f;
    newZoomScale = MAX(newZoomScale, self.scrollView.minimumZoomScale);
    [self.scrollView setZoomScale:newZoomScale animated:YES];
}

- (UIView*)viewForZoomingInScrollView:(UIScrollView *)scrollView {
    // Return the view that you want to zoom
    return self.vwImages;
}

- (void)scrollViewDidZoom:(UIScrollView *)scrollView {
    // The scroll view has zoomed, so you need to re-center the contents
    [self centerScrollViewContents];
}

【讨论】:

  • CGPoint pointInView = [recognizer locationInView:self.imageView];如何获取Imageview?
【解决方案2】:

将 UIView 的对象作为容器,例如 viewContainer

[viewContainer addSubView:imageView1];

[viewContainer addSubView:imageView2];

[scrollView addSubView:viewContainer];

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return viewContainer;
}

添加

【讨论】:

    【解决方案3】:

    你可以用这个

    - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
    {
        return [self.scrollView.subviews objectAtIndex:0];
    }
    

    viewForZoomingInScrollView 委托方法返回索引 0 处的对象。

    来自Properly zooming a UIScrollView that contains many subviews

    【讨论】:

      【解决方案4】:

      在视图中同时添加 imageView 并替换此方法

      - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
      {
          return view;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-29
        • 2011-12-27
        • 2012-12-19
        相关资源
        最近更新 更多