iOS: UIScrollView 缩放程序化不起作用

6

我有一个可分页的UIScrollView,其中包含不同类型的信息,例如UITable和可缩放的图像。因此,我设置了一个可分页的主ScrollView,作为子视图添加了可缩放的图像ScrollView,并将图像作为内容。 一切都很好,只是我无法设置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];
}

主ScrollView和图片滚动视图都能够完美绘制,并且可以正确地进行缩放和分页。最小缩放因子的计算也是正确的。当我缩小时,我可以一直缩小到达到图像限制。但是,第一次切换到图片滚动视图时,它的当前缩放比例总是1.0,而应该是最小比例。

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

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

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

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

更新: 好的。同时我发现问题很可能来自我的“子视图”ScrollView的基础布局。当我缩放其中一张图片并记录ScrollView的当前缩放因子时,它们全部相同(包括主ScrollView和所有子ScrollView)。 这可能的原因是什么,或者怎样通过不同的布局来解决它?

4个回答

6

我认为viewForZoomingInScrollView:可能没有被滚动视图调用。尝试添加断点并检查你在那里返回什么。


3
你的代码无法运行,因为你没有设置minimumZoomScale,它的默认值是1.0。由于你试图设置的0.5低于默认值,所以它无法工作。
在设置maximumZoomScale之后添加以下行。
[imageScrollView setMinimumZoomScale:0.25];

谢谢你的回答,但是实际上我已经在上面的代码中设置了最小缩放比例:[imageScrollView setMinimumZoomScale:zoomscale]; 当我查看其中一张图片并使用捏合手势进行缩小时,我可以一直缩小直到达到图像边界,因此缩放因子是正确的。 - user2014551
我的错误! :) 但是我的意思是,如果你的 zoomscale 值不低于0.5(或相等),当您尝试将其编程设置为0.5时,它将不会缩小。 - Rukshan
当然,但它将会缩放到最小比例,但这并没有发生,所以肯定还有其他错误 :-( - user2014551
也许问题与自动布局约束有关。最好也检查一下它。 - Rukshan

0
与此同时,我发现以下代码在某些情况下可能会出现问题。有时当我对图像进行缩放时,主滚动视图就无法滚动了,因此除了触发页面控制器或缩放到图像并滚动到其边界以使主滚动视图跳转到下一页之外,没有其他方法可以进入下一张图片。
这意味着只有当图像完全缩小时(.scale = .minimumscale)才会出现问题。我不明白它何时以及为什么会发生。在这种情况下,记录viewDidScroll没有任何返回值。
有人遇到过类似的问题吗?

你是否已经找到了这个问题的解决方案? - el-flor

0
正如用户Rivera所指出的,viewForZoomingInScrollView:的返回值当然不正确。我总是返回scrollView中当前可见的页面。这意味着在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];
}

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