缩放嵌套在 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 内的 MPMoviePlayerController 缩放问题
UIScrollView 子视图在缩放下不保持正确的边界尺寸