iPhone:如何在捏缩放uiscrollview时重绘子视图

Posted

技术标签:

【中文标题】iPhone:如何在捏缩放uiscrollview时重绘子视图【英文标题】:iPhone: how do i redraw subviews while pinch zooming a uiscrollview 【发布时间】:2010-02-04 22:38:40 【问题描述】:

我正在开发一个 iPhone 应用程序,它将多个自定义 UIViews 作为子视图放置在 UIScrollView 中。子视图作为透明视图放置在彼此的顶部,因为每个视图都有自己的绘图例程来跟踪基础视图的某些部分。基本视图是 UIImageView,它通常是我希望用户能够平移和放大和缩小的大图像。

我遇到的问题是,当我放大和缩小 UIScrollView 时,子视图不会在用户缩放时重绘自己。缩放完成后,我可以正确重新定位和缩放子视图,但用户体验不太理想。我无法找到隐藏或重绘子视图的方法,因为正在缩放以将子视图与 ImageView 一起缩放。

有什么想法吗?

谢谢!

这是我实现的代码:

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale 

 for (UIView *view in subViews)
 
  [view updateView:scale];
 


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

【问题讨论】:

创建一个包含图像的 UIView 以及所有其他子视图,并在 viewForZoomingInScrollView 方法中返回该父视图。缩放时所有子视图都将被缩放,尚未测试过这对文本和复杂视图的效果如何,只是尝试使用矩形。 【参考方案1】:

在 >=3.2 中现在有: - (void)scrollViewDidZoom:(UIScrollView *)scrollView

所以在未来的某一天,这将是解决这个问题的明智之选。

【讨论】:

【参考方案2】:

您从viewForZoomingInScrollView: 返回的imageView 将随着视图的缩放而调整大小。您可以在该视图中实施setFrame: 或更标准的layoutSubviews 来进行更新。滚动视图的contentSize 在缩放过程中也会不断更新,因此您可以在自定义滚动视图中实现setContentSize:

【讨论】:

【参考方案3】:

我不知道实现它的正确方法,但我有一个解决方法给你:

由于viewForZoomingInScrollView 是在缩放之前调用的,scrollViewDidEndZooming 是在缩放之后调用的,因此您可以使用viewForZoomingInScrollView 在单独的线程中调用方法。该方法将每 100 毫秒(或任何其他看起来不错的时间段)检查您的 UIScrollViewzoomScale,并将进行所有需要的更改。在scrollViewDidEndZooming 中,您将停止执行新方法。

【讨论】:

我用 NSTimer 而不是线程尝试了这个,我认为这可以实现同样的效果。但是,模拟器中的性能确实很差,使体验更加糟糕。我想我会尝试隐藏子视图,看看这是否是更好的体验。也许我需要重新考虑我是如何设计子视图的,也许只需要创建一个单独的视图来处理触摸事件的所有渲染和检测。

以上是关于iPhone:如何在捏缩放uiscrollview时重绘子视图的主要内容,如果未能解决你的问题,请参考以下文章

iPhone iOS如何在启用缩放时使UIScrollView与UIRotationGestureRecognizer一起工作?

为啥在捏缩放手势期间调用 setScaleX 会导致闪烁?

iphone:UIScrollView 分页启用,无缩放和无预览

UIScrollView中的iPhone UIImageView没有缩放到中心

如何在uiscrollview中双击缩放和两个手指缩放uiimage

在重绘屏幕之前,如何阻止 iPhone 显示变换更改