ios 如何围绕CALayer的Y轴翻转CALayer?

k97glaaz  于 2023-02-10  发布在  iOS
关注(0)|答案(3)|浏览(145)

我在CALayer的子类中使用了这段代码,该子类的示例是根CALayer的子层。

-(void)setSelected:(bool)s {
    selected=s;
    if (s)
    {
        CATransform3D  rot = CATransform3DMakeRotation(M_PI, 0, 1, 0);
        rot.m34=-1.0 / 200;
        [self setTransform:rot];

    }
    else
    {
            CATransform3D  rot = CATransform3DMakeRotation(0, 0, 1, 0);
        rot.m34=-1.0 / 200;
        [self setTransform:rot];
    }
}

当selected属性设置为TRUE时,会发生以下情况:旋转直到Angular 等于M_PI/2,然后层消失,因为它是正交的。动画的结尾是错误的:在动画的第一部分(例如在左边)看起来增长的边,在左边而不是右边结束动画。2但是内容被翻转。
我认为这与两个旋转矩阵之间的插值有关,但我不能确切地理解发生了什么。
详细信息:动画看起来像是在执行以下操作:
1.以+Pi/2为增量绕Y轴旋转
1.内容翻转
1.以-Pi/2为增量绕Y轴旋转,就像它从(yz)平面反弹一样
翻转的内容是我正在努力实现的。
这是我得到的动画帧。如你所见,梯形的小边总是在左边;它应该在动画结束时的右边(右上帧)。x1c 0d1x

vcudknz3

vcudknz31#

如果有人只想水平翻转图像或视图的方向

yourView.layer.transform = CATransform3DMakeScale(-1, 1, 1)

yourView.layer.setAffineTransform( CGAffineTransformMakeScale(-1, 1) )
np8igboo

np8igboo2#

变换的数学运算不正确。您应该在旋转变换之后应用透视变换,这意味着要连接两个变换。更改旋转变换的m34系数是不等效的。
应将代码替换为以下代码:

-(void)setSelected:(bool)s {
    selected=s;
    CATransform3D perpectiveTransform = CATransform3DIdentity;
    perpectiveTransform.m34 =-1.0 / 200;

    if (s)
    {

        CATransform3D  rot = CATransform3DMakeRotation(M_PI, 0, 1, 0);
        [self setTransform:CATransform3DConcat(rot, perpectiveTransform)];

    }
    else
    {
        CATransform3D  rot = CATransform3DMakeRotation(0, 0, 1, 0);
        [self setTransform:CATransform3DConcat(rot, perpectiveTransform)];
    }
}

顺便说一下,应用透视变换的一种更为方便的方法是使用超层的sublayerTransform属性,从而将其应用于每个子层(如果需要)。
这将产生如下结果:

self.superlayer.sublayerTransform = perspectiveTransform;  //do this in your setup
....
self.transform = rot;

以获得相同的外观效果。

j2cgzkjk

j2cgzkjk3#

假设你的图层是一块半透明的平面塑料,上面投射了一个图像,所以它可以从两面发光。当旋转pi/2时,它是边缘朝上的,所以它会消失。当你的旋转大于pi/2但小于pi时,平面塑料的背面会暴露出来。因为它是半透明的,所以你可以看到图像的背面。但是因为你是从后面看的,所以它是镜像的。当Angular 达到π时,薄片在y轴上翻转了整整180度。它是颠倒的,你可以从后面看到图像,所以它是反向的。

相关问题