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 毫秒(或任何其他看起来不错的时间段)检查您的 UIScrollView
的 zoomScale
,并将进行所有需要的更改。在scrollViewDidEndZooming
中,您将停止执行新方法。
【讨论】:
我用 NSTimer 而不是线程尝试了这个,我认为这可以实现同样的效果。但是,模拟器中的性能确实很差,使体验更加糟糕。我想我会尝试隐藏子视图,看看这是否是更好的体验。也许我需要重新考虑我是如何设计子视图的,也许只需要创建一个单独的视图来处理触摸事件的所有渲染和检测。以上是关于iPhone:如何在捏缩放uiscrollview时重绘子视图的主要内容,如果未能解决你的问题,请参考以下文章
iPhone iOS如何在启用缩放时使UIScrollView与UIRotationGestureRecognizer一起工作?
iphone:UIScrollView 分页启用,无缩放和无预览
UIScrollView中的iPhone UIImageView没有缩放到中心