图层在x/y轴上旋转而不是z轴

3
在创建一个测试项目以帮助回答我最近在SO上提出的一个相关问题(已删除)后,我遇到了一个不同但相似的问题,即在自定义UIView子类中旋转图层时。可以在这里看到iPhone模拟器会话的视频。
图层看起来像是在对角线上绕x/y轴旋转,而不是像期望的那样绕z轴旋转。
执行旋转的代码位于一个名为setAngle:的视图setter方法中,如下所示:
_imageLayer.transform = CATransform3DMakeRotation(angle / 180.0 * M_PI, 0.0, 0.0, 1.0);

(其中angle以度为单位.)

完整的Xcode项目可以在这里找到。

原始的SO问题只在设备方向改变后显示此行为,因此我的理解存在更多差距,比我最初想象的要多(来自OSX背景,并且多次使用图层,我没有预料到会出现这样的问题)。

所以我的问题是:为什么图层不能像期望的那样围绕z轴旋转?


我对此有所进展,与图层“frame”的设置方式有关。如果我改为设置“bounds”和“position”,那么图层将会正常旋转,但是关键在于需要获取视图的宽度/高度并考虑设备方向。这就是我的理解所欠缺的地方... - trojanfoe
2个回答

2

我正准备回答,但你抢先了!不管怎样,这就是我要说的(它确实涉及到你最后一个观点)

不可预测行为的主要原因是您正在对转换后的对象设置框架属性。这是不允许的-苹果公司警告不要这样做*:在应用变换后,框架属性将返回未定义的结果。

所以,您不应这样做:

 //_imageLayer.frame = layerFrame;

但是设置 boundscenter 属性(CALayers 的情况下是 position)仍然按预期工作,因此您可以这样做:

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


* 查看UIView的frame属性的文档

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


啊,好的;我错过了那个,所以这是问题的根本原因。非常感谢。 - trojanfoe

0

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

我们学到的问题是:

  • 不要在视图控制器的 viewWillLayoutSubviews 中设置视图的框架。这可能是问题的根本原因。

  • 不要在 [UIView layoutSubviews] 中排列图层,因为这会在旋转图层时调用,效率低下。我改用 [UIView setBounds:] 来布局图层。当设备方向改变时,会调用 setBounds:,但由于某种奇怪的原因,在新创建的视图上却没有调用,所以我重写了 [UIView didMoveToSuperview] 来显式地调用它(self.bounds = self.bounds;)。更加好奇了。

  • 我在布局时设置了图层的 boundsposition,而不是设置图层的 frame我认为这是根本原因(事情在我做了这件事后开始正常工作),然而我看不出这会有什么区别,我认为这是在第一条错误中提到的副作用的治愈措施更新:正如 @He Was 答案中指出的那样;这确实是问题的根源。

我不会将这个答案标记为正确,因为我仍然有一种隐隐的感觉,我的解决方案并不是100%“正确”的。


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