缩放嵌套在 UIScrollView 中的子视图

Posted

技术标签:

【中文标题】缩放嵌套在 UIScrollView 中的子视图【英文标题】:Scaling subviews nested deep within UIScrollView 【发布时间】:2011-01-23 19:40:12 【问题描述】:

这让我头疼不已。

我正在尝试为 iPad 创建一个 UML 绘图应用程序。

我目前具有向“画布”添加类的功能。画布只是一个 UIView,它位于 UIScrollView 中。

每个类元素都是一个包含类名、属性和方法(UITextFields)的 UIView。这些都是画布的子视图。

我遇到的问题是,当我使用捏/缩放功能放大类时,UITextFields 变得模糊。据我了解,这是因为 UIScrollView 只是应用了变换,而我需要自己处理缩放。

但是,我能想到的唯一方法是重新绘制类并使它们更大,这可能会扭曲它们相对于彼此的位置。例如,如果我有两个并排的班级,其中一个的大小翻了一番,那么左边的班级可能会与右边的班级重叠。

我已经搜索了几个小时来寻找解决方案,但我一无所获,有人知道可以说明类似于我的情况的代码示例或建议吗?或者,如果不是,一个示例显示如何以我描述的方式缩放 UITextField(或 UILabel)?

【问题讨论】:

【参考方案1】:

根据我的问题的措辞方式,我认为这可能不是最明显的答案。但我这样解决了这个问题:

第一步是实现:

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

关键点我似乎遗漏了(不知何故),当 UIScrollView 被缩放时,它会将其比例因子重置为 1。所以想象一下你放大到 125%,然后缩小25%,您实际上会以 93%(ish)而不是 100% 查看原始视图。

如果您像我一样尝试根据原始大小缩放子视​​图,这显然会抛出您的绘图。

最好的方法是跟踪比例(我使用了变量 scaleTracker),然后使用该值来缩放您的视图。

更具体地说,我使用了以下代码:

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


scaleTracker *= scale;

[canvas setTransform:CGAffineTransformIdentity];

canvas.frame = CGRectMake((int)canvas.original.origin.x,
                              (int)canvas.original.origin.y,
                              (int)(canvas.original.size.width * scaleTracker),
                              (int)(canvas.original.size.height * scaleTracker));

祝所有遇到 UIScrollView 问题的人好运。现在我希望这可以为任何有兴趣的人提供一些帮助。

【讨论】:

以上是关于缩放嵌套在 UIScrollView 中的子视图的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollview 在缩放时同步子视图原点

UIScrollView 内的 MPMoviePlayerController 缩放问题

UIScrollView 子视图在缩放下不保持正确的边界尺寸

内部动画时的 UIScrollView 回调

具有水平缩放的 UIScrollView - 在子视图中绘制的贝塞尔路径模糊

UIScrollView中的drawRect裁剪