CGAffineTransform缩放在iOS10上移动视图中心(并且不在iOS11上)

时间:2018-01-19 16:05:51

标签: ios swift ios-autolayout cgaffinetransform

我有一个支持iOS10和iOS11的应用程序。在应用程序中,我有一个uiview通过平移手势固定到手指。平移手势仅沿y轴移动视图中心(x始终保持相同)。我还将CGAffineTransform与手势联系起来,用户移动我的视图越多,它变得越大。 "摇摄"视图包含另一个包含一些内容的视图。

现在在iOS11上我有这种行为(我认为是正确的):

             > - center of content view stays on a vertical line
^  <--[      |      ]-->
|  <----[    |    ]---->
|  <------[  |  ]------>
|  <--------[ ]-------->

但是在iOS10上,我得到了这样的行为:

                > - center of content view moves to the right along with scale growth 
^  <----[      /      ]>
|  <-----[    /    ]--->
|  <------[  /  ]------>
|  <--------[ ]-------->

我的代码将内容视图添加到平移视图:

// self is PannedView 
self.addSubview(contentView)
contentView.translatesAutoresizingMaskIntoConstraints = false
// add constraints:
// self.width = contentView.width
// self.height = contentView.height
// self.centerX = contentView.centerX
// self.centerY = contentView.centerY

处理平移手势:

... // handle some unrelated stuff
panView.center.y = self.panStartPoint.y + panDeltaY // where panDeltaY is basically a translation of a UIPanGestureRecognizer
... // some scale calculation logic, calc scale addition depending on pan touch location
let scale = 1 + movePercent * 0.1 // where movePercent is between 0 and 1
panView.transform = CGAffineTransform.identity.scaledBy(x: scale, y: scale)

正如您所看到的,我也将比例限制在11.1之间。

看起来,在iOS10和iOS11上,缩放与缩放相关的约束或缩放是&#34; double&#34;以某种方式传播到子视图。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

不要将变换应​​用于由约束定位的视图。结果是未定义的(这正是您所经历的:它“意味着”在一个系统上有一件事,另一件在另一个系统上)。