缩放嵌套在UIScrollView内的子视图

时间:2011-01-23 19:40:12

标签: iphone ipad uiview uiscrollview uitextfield

这让我头疼不已。

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

我目前有将功能添加到'画布'的功能。画布只是一个UIView,位于UIScrollView中。

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

我遇到的问题是当我使用捏合/缩放功能放大类时,我只是模糊的UITextFields。据我所知,这是因为UIScrollView只应用了一个转换,我需要自己处理扩展。

然而,我能想到这样做的唯一方法是重新绘制类并使它们变大,这可能会使它们相对于彼此的位置失真。例如,如果我有两个并排的类,一个大小加倍,那么左类可能与右类重叠。

我已经搜索了几个小时的解决方案而且我无处可去,是否有人知道代码示例或可以说明类似于我的情况的建议?或者,如果没有,这个例子展示了如何以我描述的方式扩展UITextField(或UILabel)?

1 个答案:

答案 0 :(得分:2)

我认为根据我的问题是如何表达的,这可能不是最明显的答案。但我解决了这个问题:

第一步是实施:

- (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问题的人好运。现在我希望这可以为任何感兴趣的人提供一些帮助。