UIView:如何“重置”变换。CGAffineTransformScale不按照我的预期工作。

9
我认为我的问题可以总结为如何存储和重置视图的变换。但是,解释我的情况可能会有所帮助。
如果我依次将以下变换应用于视图(例如,如果我将此代码添加到开关或按钮中),我会得到完全符合预期的结果:缩放在原始视图的大小上有效地切换至.55倍的视图,并且在其原始比例下的视图。也可以按照所需缩放sub-views of someView,就像我想要的那样,无限循环。完美的解决方案。
//tranformScale 1
someView.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.55, 0.55 );
//tranformScale 2
someView.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.0, 1.0 );

麻烦的是我想使用这个代码(或者类似的)在iOS设备进入横屏时缩放self.view的子视图,以适应横屏屏幕的子视图(并在竖屏时恢复原状)。它几乎能正常工作,但由于某种原因,与使用按钮调用变换的测试中产生圆形值相反,会产生渐进的奇怪值来输出被缩放的视图的框架。最终,在大约4次旋转后,子视图飞出了屏幕。我怀疑这与self.view改变形状有关,但当我记录self.view的框架时,它的形状非常可预测。
顺便说一下,我正在使用autoresizingMask灵活的边距来居中视图,而不是使用自动布局。也许我应该使用其他类型的计算来居中视图?
感谢您的阅读!

1
您可以设置 someView.transform = CGAffineTransformIdentity; 来将其重置为无变换状态。这样更容易理解。 - David Rönnqvist
谢谢,但即使这样我也得到了奇怪的结果。 - OWolf
当非恒等变换被应用时,您知道框架是伪造的,对吗?从UIView上的frame文档中: "警告:如果变换属性不是恒等变换,则此属性的值是未定义的,因此应将其忽略。" - David Rönnqvist
David - 你能澄清一下你的说法吗?这是否意味着变换必须针对“原始”才能使帧准确(这意味着多个/堆叠的变换会产生不良结果?我也正在处理多个变换,结果也很奇怪。 - wayneh
2个回答

34

我做了这件事,结果非常完美。

self.imageview.transform = CGAffineTransformIdentity

如果您通过滑动视图来关闭它,那么视图不会重新缩放到原始大小。 - Muhammad Shauket

7

(1) 在应用转换后,请确保不设置或获取任何框架数据,这是不支持的,会产生不可预测的结果;

(2) 关闭自动调整大小掩码弹性边距和居中,方法如下:

   view.center = CGPointMake(view.superview.bounds.size.width/2, 
                             view.superview.bounds.size.height/2);

注意在视图处于全尺寸时应用居中对齐。即,如果是调整大小变换,则在变换之前应用居中对齐;如果是标识变换,则在变换之后应用居中对齐。请注意保留 HTML 标记。

谢谢,解决了!太好了,是庆祝的时候了。 - OWolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接