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

iOS:UIScrollView以编程方式缩放不起作用,ios,uiscrollview,zooming,scrollview,Ios,Uiscrollview,Zooming,Scrollview,我有一个可分页的UIScrollView,它包含不同类型的信息,比如UITables,但也包含可缩放的图像。所以,我设置了一个可分页的主滚动视图,并作为子视图添加了可缩放的图像滚动视图,其中图像作为内容。 一切正常,只是我无法设置ImageScrollView当前较小的缩放比例 UIImageView *imageView = [[UIImageView alloc] initWithImage:Image]; //storing a link to the imageView [imagel

我有一个可分页的UIScrollView,它包含不同类型的信息,比如UITables,但也包含可缩放的图像。所以,我设置了一个可分页的主滚动视图,并作为子视图添加了可缩放的图像滚动视图,其中图像作为内容。 一切正常,只是我无法设置ImageScrollView当前较小的缩放比例

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];
}
主滚动视图和图像滚动视图绘制完美,可以正确缩放和分页。最小缩放因子的计算结果也是正确的。当我缩小时,我可以放大直到达到图像限制。但是,我第一次翻页到图像滚动视图时,它的当前缩放比例始终为1.0,而它应该是最小比例

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

[changeScrollView setZoomScale:changeScrollView.minimumZoomScale animated:YES];
如果我记录当前缩放比例,我总是得到1.0

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

更新: 可以与此同时,我发现问题最有可能来自我的基本布局,即将“子视图”滚动视图转换为另一个滚动视图。当我缩放其中一个图像并记录ScrollView的当前缩放因子时,它们都是相同的(主ScrollView和所有子ScrollView)。
原因可能是什么,或者我如何用不同的布局解决它?

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

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

[imageScrollView setMinimumZoomScale:0.25];

我认为
viewForZoomingInScrollView:
可能不会被scrollview调用。尝试添加断点并检查返回的内容。

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

下面是正确的代码:我制作了一个函数,它将始终重置当前可见滚动页面的左侧和右侧图像:

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

与此同时,我发现下面的代码在某些情况下会出现问题。有时,当我从图像中放大和缩小时,主滚动视图无法再滚动,因此无法进入下一个图像,除非触发页面控件或放大图像,然后滚动到其边框,以便主滚动视图跳到下一页

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


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

谢谢你的回答,但我确实设置了最小缩放比例,正如你在上面的代码中所看到的:
[imageScrollView setMinimumZoomScale:zoomscale]当我转到其中一张图像并使用“捏”手势缩小时,我可以缩小,直到达到图像的边界,以便系数正确。我的错误!:)然而,我的观点是,如果
zoomscale
值不低于0.5(或等于0.5),当您尝试以编程方式将其设置为0.5时,它将不会缩小。但是它会放大到最小的比例,这是不会发生的,所以肯定还有另一个错误:-(可能问题与自动布局约束有关。最好也检查一下。你有没有找到解决方案?
if (i == 1) {
    updatePage = 0;
    [imageScrollView setZoomScale:imageScrollView.minimumZoomScale];
}