【发布时间】:2014-09-12 15:42:31
【问题描述】:
我在缩放转换时遇到问题,我必须将其应用于 Swift 上的 UIViews(但在 Objective-c 中也是如此)
我在gestureRecognizer 期间将CGAffineTransformMakeScale() 应用于多个视图。
这就像卡片组的循环。我删除了顶部的一个,放大后面的 X 个,然后在后面添加了一个新的。
第一次迭代按预期工作。但是当我尝试刷新的前一张时,所有卡片都会重置为其初始帧大小,因为我正在尝试应用新的变换,这似乎取消了前一个并将视图重置为其初始状态。
如何根据 UIView 生成的新大小确定/提交第一个转换更改,以便能够在此之后应用新的转换?
我尝试了UIView.commitAnimations(),但没有任何变化。
编辑:
这是一个简单的例子来理解我试图做什么:
假设我有一个 100x100 的初始 UIView
我的收缩系数为 0.95,这意味着后面的下一个视图将是 95x95,然后是 90.25,然后是 85.73,等等
如果我删除顶部的 (100x100),我想放大其他的,所以 95x95 将变为 100x100,等等
这是通过应用收缩因子的倒数来完成的,这里是 1.052631...
我第一次应用逆因子时,所有视图都已正确调整大小。
我的问题是,当我通过在新的前端 UIView 上滑动再次触发所有视图的新调整大小时(例如,变成 95x95 的 90.25x90.25 现在应该缩放到 100x100)。
此时,相同的CGAffineTransformMakeScale() 应用于所有视图,所有视图都立即重置为其原始帧大小(因此现在的 95x95 重置为 90.25x90.25,然后开始对这个旧大小应用转换)。
正如这里或其他地方所建议的那样,在每次转换结束时使用 UIView.commitAnimations() 不会改变任何东西,使用 CGAffineTransformConcat() 就像自己控制缩放一样,当然视图变得非常大.. .
我希望我把自己说得更清楚了,这并不容易解释,不要犹豫,问这里是否有问题。
【问题讨论】:
-
我能想到的一种方法是调整卡的帧而不是使用CGAffineTransforms。或者,您可能需要应用 CGTransformConcat(view.transform, newScaleTransform) ?
-
我考虑过使用 CGTransformConcat,但问题是它会产生巨大的变换(就像我的比例因子的幂^2)。而且我想避免每次都重新计算一个新因素,以便能够将其添加到前一个因素中。之前的“提交”然后应用相同的因素会更容易做到。
-
您可能误解了
CGTransformConcat的作用。听起来您希望它占用更多存储空间,而它真正做的是在数学上连接两个变换(通过矩阵乘法),因此数据大小保持不变。 -
我已经编辑并添加了一个我正在尝试做的具体示例,希望这会有所帮助。
标签: ios objective-c uiview swift