3

在创建了一个测试项目以帮助获得我最近在 SO(已删除)上提出的相关问题的一些答案后,在自定义子类中旋转图层时,我遇到了一个不同但类似的问题UIView

可以在这里看到 iPhone 模拟器会话的视频。

该图层看起来像是在 x/y 轴上以对角线旋转,而不是根据需要围绕 z 轴旋转。

执行旋转的代码在一个视图设置方法中,调用setAngle:如下:

_imageLayer.transform = CATransform3DMakeRotation(angle / 180.0 * M_PI, 0.0, 0.0, 1.0);

angle度数在哪里)。

完整的 Xcode 项目可在此处获得。

最初的 SO 问题仅在更改设备方向后才显示此行为,因此我的理解似乎比我最初想象的要多(来自 OSX 背景,并且多次使用图层,我预计不会出现此类问题)。

所以我的问题是:为什么图层没有按需要围绕 z 轴旋转?

4

2 回答 2

2

我正要回答却被你抢先了!无论如何,这就是我要说的(它确实解决了你的最后一点)

不可预知行为的主要原因是您在变换的对象上设置了 frame 属性。这是你不能做的 - Apple 警告它*:在应用转换后,frame 属性将返回未定义的结果。

所以你不应该这样做:

 //_imageLayer.frame = layerFrame;

但设置boundscenter属性(position在 CALayers 的情况下)继续按预期工作,因此您可以执行以下操作:

   _imageLayer.bounds = (CGRect){0,0,min,min};
   _imageLayer.position = self.center;  


* 请参阅UIView 中 frame 属性的文档:

警告:如果变换属性不是恒等变换,则此属性的值未定义,因此应被忽略。

于 2013-02-16T14:31:40.710 回答
0

好的,这个问题现在已经解决了。更新的项目在这里

学到的问题是:

  • 不要从视图控制器的viewWillLayoutSubviews. 这可能是问题的根本原因。 您不需要在自定义[ViewController _currentRect]方法中执行任何计算,只要将自动调整大小掩码设置为将视图拉伸到窗口边界即可。

  • 不要[UIView layoutSubviews]像旋转图层时所说的那样排列图层(!!),这是低效的。相反,我过去常常[UIView setBounds:]布置图层。 setBounds:在设备方向更改后调用,但由于某种奇怪的原因,它没有在新创建的视图上调用,所以我重写[UIView didMoveToSuperview]为显式调用它(self.bounds = self.bounds;)。越来越好奇。

  • 我设置了图层boundsposition而不是frame在布置图层时设置图层,我认为这是根本原因(在我这样做之后事情开始起作用),但是我看不出这有什么不同,我认为这已经治愈作为第一个要点中提到的错误的副作用更新:正如@He Was 的回答所指出的那样;这根本原因。

我不会将此答案标记为正确,因为我仍然有一种痛苦的感觉,即我的解决方案不是 100%“正确”。

于 2013-02-16T14:14:14.573 回答