ios - 绝对应用 CGAffineTransform* 到 UIView

标签 ios objective-c uiview swift

我在缩放转换时遇到问题,我必须在 Swift 上应用于 UIViews(但在 objective-c 中也一样)

我在 gestureRecognizer 期间将 CGAffineTransformMakeScale() 应用于多个 View 。

这就像卡片组的循环。我删除了顶部的一个和后面的其他 X 个按比例放大,并在后面添加了一个新的。

第一次迭代按预期工作。但是,当我尝试滑动新的正面卡片时,所有卡片都重置为其初始帧大小,因为我正在尝试应用新的变换,这似乎取消了前一个并将 View 重置为其初始状态。

我如何才能明确地应用/提交第一个转换更改,以便能够根据 UIView 产生的新大小应用新的转换更改?

我尝试了 UIView.commitAnimations() 但没有任何变化。

编辑:

这是一个简单的例子来理解我尝试做的事情:

假设我有一个 100x100 的初始 UIView

我有一个 0.95 的收缩系数,这意味着后面的下一个 View 将是 95x95,然后是 90.25,然后是 85.73,等等

如果我删除最上面的一个 (100x100),我想放大其他的,所以 95x95 将变成 100x100,等等
这是通过应用收缩因子的倒数来完成的,这里是 1.052631...

我第一次应用逆因子时,所有 View 都正确调整了大小。
我的问题是,当我通过在新的前端 UIView 上滑动再次触发时,所有 View 的大小都会重新调整(因此,例如,变成 95x95 的 90.25x90.25 现在应该缩放到 100x100)。
此时,相同的 CGAffineTransformMakeScale() 应用于所有 View ,所有 View 立即重置为其原始帧大小(因此现在的 95x95 重置为 90.25x90.25,然后开始应用转换在这个旧尺寸上)。

如这里或其他地方所建议的,在每次转换结束时使用 UIView.commitAnimations() 不会改变任何东西,使用 CGAffineTransformConcat() 就像通电他自己一遍又一遍地缩放,当然 View 变得非常大......

我希望我说得更清楚,这不容易解释,请不要犹豫,问这里是否有问题。

最佳答案

经过大量阅读和咨询比我更了解 iOS 编程的同事,这是我的结论:

  • 应用 CGAffineTransformMakeScale() 仅在视觉上修改 View 而不是其属性,并且由于事后修改 View 的边界和/或框架很困难(而且成本很高),我应避免尝试进行转换、更新边界、进行另一次转换等。

  • 应用相同的 CGAffineTransformMakeScale() 只会重置效果,不会应用于之前的效果。

  • 在之前的 CGAffineTransformMakeScale() 之上应用具有相同值的 CGAffineTransformScale()(或使用 CGAffineTransformConcat()) 有一些不可预测的效果,并且很难精确计算每次应用的新值以获得我想要的效果。

我可以采用的最佳方法是仅应用一个 CGAffineTransformMakeScale(),我将在 View 的整个生命周期中不断更新比例值。 这意味着我现在要反向修改我的所有实现逻辑,但这是正确执行此操作的最简单方法。

感谢大家的提示。

关于ios - 绝对应用 CGAffineTransform* 到 UIView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25812010/

相关文章:

ios - Xcode 设备不可用,未找到运行时配置文件

ios - 使用核心数据 Swift 3 保存数组?

ios - 获取 iPhone 所在的国家(没有 CLLocationManager)

iphone - 当我触摸 UIVIew 时,CALayer/UIView 崩溃

iphone - 这个标志的含义是什么?

objective-c - 从另一个 View Controller 修改 View Controller 的属性

ios - 当我尝试分配 UIPopoverController 时崩溃

ios - 将 max float 用于 boundingRectWithSize 的高度是否有效

ios - 如何以编程方式确定我的应用程序是否在 iphone 模拟器中运行?

c# - MonoTouch 从 subview 设置位置