iOS:UIScrollView以编程方式缩放不起作用

时间:2014-03-24 09:47:40

标签: ios uiscrollview zoom scrollview

我有一个可分页的UIScrollView,它包含不同类型的信息,如UITables,还有可缩放的图像。因此,我设置了一个可分页的主ScrollView,作为子视图,我添加了zoomable 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];
}

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

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

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

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

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

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

4 个答案:

答案 0 :(得分:6)

我认为滚动视图可能无法调用viewForZoomingInScrollView:。尝试添加一个断点并检查你在那里返回的内容。

答案 1 :(得分:3)

您的代码无法正常工作,因为您尚未设置minimumZoomScale,其默认值为1.0。由于您尝试将0.5设置为低于默认值,因此无法正常工作。

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

[imageScrollView setMinimumZoomScale:0.25];

答案 2 :(得分: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];
}

答案 3 :(得分:0)

与此同时,我发现下面的代码在某些情况下会产生问题。有时当我从图像放大和缩小时,主ScrollView不能再滚动,所以除了触发pageControl或者除了放大图像然后滚动到它的边界之外,没有办法到达下一个图像所以主ScrollView跳转到下一页。

表示仅在图像完全缩小(.scale = .minimumscale)时才会出现问题。我不确切地知道它何时以及为何发生。在这种情况下,记录viewDidScroll不会返回任何内容。

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