UIScrollView:缩放后无法建立现状

Posted

技术标签:

【中文标题】UIScrollView:缩放后无法建立现状【英文标题】:UIScrollView: Can't establish status quo after a zoom 【发布时间】:2011-06-15 22:38:38 【问题描述】:

我正在尝试将低分辨率图像加载到滚动视图中,并在第一次缩放后将其替换为高分辨率图像。第一次尝试并不顺利。为了让我更好地了解正在发生的事情,我现在尝试加载高分辨率图像并在第一次缩放后用相同的高分辨率图像替换它,即建立现状。在我看来DidLoad 我有:

imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"LargeImage.png"]];
[scrollView addSubview:imageView];

scrollView.contentSize = imageView.bounds.size;
scrollView.minimumZoomScale = 1.0;
scrollView.minimumZoomScale = 0.25;
scrollView.zoomScale = 0.251497;
scrollView.clipsToBounds = YES;
scrollView.delegate = self;

这给出了: imageView.frame.size = 420,580(滚动视图的框架) imageView.bounds.size = 1670,2306

在scrollViewDidEndZooming中:我愿意:

[imageView removeFromSuperview];
[imageView release];
scrollView.zoomScale = 1.0;

CGRect svb = CGRectZero;
svb.size = scrollView.frame.size;
scrollView.bounds = svb;

imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"LargeImage.png"]];
[scrollView addSubview:imageView];

scrollView.contentSize = imageView.bounds.size;
scrollView.maximumZoomScale = 1.0;
scrollView.minimumZoomScale = 0.25;
scrollView.zoomScale = 0.251497;

这给出:

imageView.frame.size = 1670,2306  
imageView.bounds.size = 1670,2306  

我不明白为什么 imageView.frame 没有像在 viewDidLoad 中那样缩放。知道我做错了什么或遗漏了什么吗?

【问题讨论】:

日志语句放在哪里? 我的 NSLog 语句“到处都是”,但是在将 zoomScale 设置为 0.251497 后立即对 imageView 进行 NSLog 处理会产生两个不同的 imageView.frame 值。 【参考方案1】:

你必须告诉scrollview你想要缩放哪个视图,这是通过委托方法- (UIView *)viewForZoomingInScrollView:(UIScrollView *)aScrollView完成的

所以在你的情况下添加这个,它会起作用!

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)aScrollView 
    return imageView;

也永远不要这样做:

imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"LargeImage.png"]];

如果您想更改实例变量,请始终这样做:

self.imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"LargeImage.png"]]; 

会导致泄漏..

更好的做法:

UIImageView *imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"LargeImage.png"]];
    self.imageView = imgView;
    [imgView release];
imgView = nil;

如果您不使用 self 执行此操作,您的程序可能会不时崩溃(并非总是如此,因此很难跟踪它)

【讨论】:

缩放工作, viewForZoomingInScrollView: 被实现(和委托集)。问题是缩放结束时,我想做我所说的“现状”,即恢复原始图像。无论出于何种原因,设置 zoomScale 时 imageView 的框架都没有正确设置。是否执行 self.imageView = ... 取决于 @property 定义,这不是我在这里遇到的问题。 为什么要先在 viewDidLoad 中将 imageView 添加为滚动视图的子视图,然后在缩放委托中再次将其添加为子视图。为什么不尝试用 self.imageView.image = [UIImage imageNamed:@"LargeImage.png"]; 替换缩放委托中的图像 如前所述,我主要将其作为练习来希望更好地了解事物的工作原理。 imageNamed:缓存图片,因此将 imageView.image 设置为同一个对象是无操作的(已尝试过)。 这是你想做的吗? youtube.com/watch?v=i8UtGtC8Kwc(缩放后用高分辨率图像替换图像) 是的,这就是我最终想要做的。 Apple 的 PhotoScroller 示例应用程序展示了如何以一般方式使用 CATiledLayer 进行操作。我正在尝试使用一张低分辨率图像并将其替换为高分辨率图像,但至少作为不使用 CATiledLayer 的练习。

以上是关于UIScrollView:缩放后无法建立现状的主要内容,如果未能解决你的问题,请参考以下文章

用UIScrollView缩放时,无法正常滚动到下端

iOS开发UI篇—UIScrollView控件实现图片缩放功能

UIScrollview 子视图在缩放后无法识别平移手势

缩放UIScrollview可缩放后如何调整UILabel文本的大小

缩放时,UIScrollview 子视图无法识别手势

UIScrollView的缩放原理