CATransform3D 旋转导致一半图像消失

问题描述 投票:0回答:4

我使用以下代码来旋转图像,但已旋转“出”页面的图像的一半(沿 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;
iphone quartz-graphics transform calayer catransform3d
4个回答
34
投票

解决方案是适当设置所有图层的

zPosition
属性。感谢@Brad Larson,他在评论中建议了这个解决方案here。看起来,当你开始使用
CATransform3D
时,由 addsubview 建立的正常 zindex 视图层次结构就被扔出了窗口。


5
投票
  layer.anchorPoint = CGPointMake(0.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 );

0
投票

为了防止其他人陷入困境,我最终通过大幅膨胀其他增量层之间的“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°) × 100px2 = 10.39px ~ 10.4 px

这意味着视图 A

zPosition
属性需要递减 10.4,以便它不会剪切视图 B。如果同一层次结构中视图 A 下方有任何其他视图,它们也必须类似地递减。 (或者,视图 B 和更高的视图需要将其图层的
zPosition
增加 10.4。)

我发现,如果我们增加视图层之间的间隙,则无需繁琐地减少或增加层。我选择了任意大的值 5000,因为它需要比 10,000 点更宽的视图才能突破相邻视图:sin(90°) × 10,0002 = 5000(90 度给出最大深度或高度)。

© www.soinside.com 2019 - 2024. All rights reserved.