应用只是一个CGAffineTransform规模组件一个UIView(Applying just

2019-10-18 09:19发布

我必须的各种尺度和旋转CGAffineTransforms已应用中,响应于触摸屏手势一个UIView。

在1.0的比例。当一个规模操作完成后,我想将视图的边界调整到新的大小,然后必须以重新绘制本身,同时保持所有其他组件的变换相同。

要调整视图的边界,我使用:

self.myView.bounds = CGRectApplyAffineTransform(self.myView.bounds, self.myView.transform);

要“撤销”的尺度变换,我想这样的:

self.myView.transform = CGAffineTransformConcat(self.myView.transform, CGAffineTransformMakeScale(1, 1));

然后调用[myView setNeedsDisplay]去重绘自己的看法。

然而,这不会产生预期的效果,并在施加旋转变换,上面的代码似乎导致什么看起来像一个侧身平移变换进行过应用。

什么是“撤消”只是一个尺度变换,并有鉴于重绘1最彻底的方法:1与所有其他转换则保持不变?

Answer 1:

我在处理类似的东西,而我做的是存储在另一个结构中的独立组件(缩放,旋转,平移)。 再这样,你可以很容易地重新创建变换(小心你的操作顺序虽然)。

但有一两件事:我建议你不改变边界,而不只是苹果规模经营变换。 这将避免一些潜在的不必要的布局。 所有的这些东西完全可以利用变换属性来处理。 你现在正在做它的方式是不会因为申请的1分至改变什么是无操作。 如果按2放大视图,你将需要0.5扩展到回到原来的。 或者,正如我上面所说的,存储所有的组件,并从单位矩阵重新创建(矩阵数学快,不用担心这一点)。



Answer 2:

保存您的刻度值的变量,然后,试着改变CGAffineTransformMakeScale(1,1)

CGAffineTransformMakeScale(1/totalScaleWidth, 1/totalScaleHeight)


文章来源: Applying just the scale component of a CGAffineTransform to a UIView