我使用以下代码来旋转图像,但已旋转“出”页面的图像的一半(沿 y 轴向下)消失了。怎么修?
heading
以弧度为单位。
CALayer *layer = myUIImageView.layer;
CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity;
rotationAndPerspectiveTransform.m34 = 1.0 / 500;
rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, heading, 0.0f, 1.0f, 0.0f);
layer.transform = rotationAndPerspectiveTransform;
解决方案是适当设置所有图层的
zPosition
属性。感谢@Brad Larson,他在评论中建议了这个解决方案here。看起来,当你开始使用 CATransform3D
时,由 addsubview 建立的正常 zindex 视图层次结构就被扔出了窗口。
layer.anchorPoint = CGPointMake(0.0, 0.0);
将
anchorPoint
设置为 {0.0, 0.0}
也有效(正如 Liam 已经指出的那样)。
以下是更改
anchorPoint
而不更改图层在屏幕上的位置的完整代码片段:
layer.anchorPoint = CGPointMake( 0.0, 0.0 );
CGPoint position = layer.position;
CGSize size = layer.bounds.size;
CGFloat posX = position.x - size.width / 2.0;
CGFloat posY = position.y - size.height / 2.0;
layer.position = CGPointMake( posX, posY );
为了防止其他人陷入困境,我最终通过大幅膨胀其他增量层之间的“z 空间”来解决这个问题。
考虑三个视图 A、B 和 C,将 A -> B -> C 放置在其父视图内。
父视图中每个视图的索引是该视图的实际位置。通过获取这些值,我们会发现视图 A 的位置为 0,视图 B 的位置为 1,依此类推。
为了解决消失/剪切问题,我通过将其位置乘以任意大的值来将
zPosition
分配给每个视图:
viewA.layer.zPosition = (0 + 1) * 5000
viewB.layer.zPosition = (1 + 1) * 5000
viewC.layer.zPosition = (2 + 1) * 5000
想象一个 100 像素宽的视图 B 旋转 12 度进入屏幕。这会导致视图 B 的左半部分消失在视图 A 下方。使用三角学,我们可以找到视图 B 的“深度”:
sin(12°) × 100px⁄2 = 10.39px ~ 10.4 px
这意味着视图 A
zPosition
属性需要递减 10.4,以便它不会剪切视图 B。如果同一层次结构中视图 A 下方有任何其他视图,它们也必须类似地递减。 (或者,视图 B 和更高的视图需要将其图层的 zPosition
增加 10.4。)
我发现,如果我们增加视图层之间的间隙,则无需繁琐地减少或增加层。我选择了任意大的值 5000,因为它需要比 10,000 点更宽的视图才能突破相邻视图:sin(90°) × 10,000⁄2 = 5000(90 度给出最大深度或高度)。