【问题标题】:iOS: UIScrollView zooming programmatically not workingiOS:UIScrollView 缩放以编程方式不起作用
【发布时间】:2014-05-01 14:19:58
【问题描述】:

我有一个可分页的 UIScrollView,其中包含不同类型的信息,例如 UITables,但也包含可缩放的图像。因此,我设置了一个可分页的 main-ScrollView 并作为子视图添加了可缩放的 image-ScrollViews,并将图像作为内容。 一切正常,只是我无法设置 imageScrollViews 的较小当前缩放比例。

UIImageView *imageView = [[UIImageView alloc] initWithImage:Image];

//storing a link to the imageView
[imagelinkArray addObject:imageView];

CGRect ScrollViewImageRect;
ScrollViewImageRect = CGRectMake((self.scrollView.frame.size.width) * i, 0, 320, self.scrollView.frame.size.height);

float widthfactor = ScrollViewImageRect.size.width / imageView.frame.size.width;
float heightfactor = ScrollViewImageRect.size.height / imageView.frame.size.height;
float zoomscale = MIN(widthfactor, heightfactor);

UIScrollView *imageScrollView = [[UIScrollView alloc] initWithFrame:ScrollViewImageRect];
imageScrollView.contentSize = CGSizeMake(imageView.frame.size.width, imageView.frame.size.height);

imageScrollView.delegate = self;

[imageScrollView setMinimumZoomScale:zoomscale];
[imageScrollView setMaximumZoomScale:1.5];

[imageScrollView addSubview:imageView];

//doesn't work:
[imageScrollView setZoomScale:0.5 animated:YES];

[self.scrollView addSubview:imageScrollView];

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return [imagelinkArray objectAtIndex:page];
}

main-ScrollView 和 image-ScrollViews 绘制完美,可以正常缩放和分页。计算的最小缩放系数也是正确的。当我缩小时,我可以放大直到达到图像限制。然而,当我第一次翻页到 image-ScrollView 时,它的当前缩放比例始终为 1.0,而它应该是最小比例。

无论我在上面的代码中设置缩放比例,它都不起作用:

[changeScrollView setZoomScale:changeScrollView.minimumZoomScale animated:YES];

如果我记录当前缩放比例,我总是得到 1.0;

唯一有效的是在- (void)scrollViewDidScroll: 方法中更改缩放比例,这当然没有多大帮助,因为缩放也会调用它来立即重置缩放。但至少我可以弄清楚,代码以某种方式工作。我感觉 UIScrollView 现在在屏幕上不可见时不会缩放。我该如何解决这个问题?

更新: 好的。与此同时,我发现问题很可能来自我将“子查看”ScrollViews 到另一个 ScrollView 的基本布局。当我缩放其中一个图像并记录 ScrollViews 的当前缩放因子时,它们都是相同的(主 ScrollView 以及所有子 ScrollViews)。 可能是什么原因,或者我该如何使用不同的布局来解决它?

【问题讨论】:

    标签: ios uiscrollview zooming scrollview


    【解决方案1】:

    我认为viewForZoomingInScrollView: 可能不会被滚动视图调用。尝试添加断点并检查您在那里返回的内容。

    【讨论】:

      【解决方案2】:

      您的代码不起作用,因为您没有设置 minimumZoomScale ,其默认值为 1.0 。由于您尝试将0.5 设置为低于默认值,因此它不起作用。

      在设置maximumZoomScale的行之后添加以下行。

      [imageScrollView setMinimumZoomScale:0.25];
      

      【讨论】:

      • 感谢您的回答,但实际上我确实设置了最小缩放比例,如您在上面的代码中所见:[imageScrollView setMinimumZoomScale:zoomscale]; 当我转到其中一张图像并使用捏合手势缩小时可以缩小直到达到图像的边界,因此该因子是正确的。
      • 我的错! :) 但是我的观点是,如果您的 zoomscale 值不低于 0.5(或等于),当您尝试以编程方式将其设置为 0.5 时,它不会缩小。
      • 当然。但它会放大到不会发生的最小比例,所以一定有另一个错误:-(
      • 可能问题与自动布局约束有关。最好也检查一下。
      【解决方案3】:

      正如用户 Rivera 指出的那样,viewForZoomingInScrollView: 的返回值是不正确的。 我总是返回滚动视图中显示的当前可见页面。这意味着在viewDidAppear 中设置缩放不会改变任何内容。

      这是正确的代码:我做了一个函数,它总是会重置当前可见滚动页面的左右图像:

      - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
          [self updateImageSize];
      }
      
      
      - (void)updateImageSize
      {
          updatePage = updatePage + 1;
      
          if (updatePage < imagescrolllinkArray.count) {
              UIScrollView *changeScrollView = (UIScrollView*)[imagescrolllinkArray objectAtIndex:updatePage];
              [changeScrollView setZoomScale:changeScrollView.minimumZoomScale];
          }
      
          updatePage = updatePage - 2;
      
          if (updatePage > -1) {
              UIScrollView *changeScrollView = (UIScrollView*)[imagescrolllinkArray objectAtIndex:updatePage];
              [changeScrollView setZoomScale:changeScrollView.minimumZoomScale];
          }
      
          //reset to current view
          updatePage = updatePage + 1;
      }
      
      
      - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
      {
          return [imagelinkArray objectAtIndex:updatePage];
      }
      

      viewDidAppear 中,我添加了以下内容以在任何拖动之前更新第一张图像。

      if (i == 1) {
          updatePage = 0;
          [imageScrollView setZoomScale:imageScrollView.minimumZoomScale];
      }
      

      【讨论】:

        【解决方案4】:

        与此同时,我发现下面的代码在某些情况下可能会出现问题。有时,当我放大和缩小图像时,主 ScrollView 无法再滚动,因此除了触发 pageControl 或放大图像然后滚动到其边框之外,无法到达下一个图像所以主 ScrollView 跳转到下一页。

        表示仅当图像完全缩小时才会出现问题(.scale = .minimumscale)。我不明白它发生的确切时间和原因。在这种情况下,记录 viewDidScroll 不会返回任何内容。

        有人遇到过类似的问题吗?

        【讨论】:

        • 你有没有找到解决办法?
        猜你喜欢
        • 2020-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-15
        • 2011-03-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多