3

我有一个需要转换的层。目前我正在使用以下内容:

self.customLayer.transform = CATransform3DRotate(CATransform3DIdentity,M_PI / 2.0f, 0, 0, 1);

这正确地使图层正面朝上,但它也需要水平翻转,因为它是错误的方式。我该如何调整CATransform3DRotate才能做到这一点?

4

3 回答 3

11

你需要:

self.customLayer.transform = CATransform3DScale(CATransform3DMakeRotation(M_PI / 2.0f, 0, 0, 1),
                                                -1, 1, 1);

带有 -1 的刻度是翻转。想象一下,您正在水平挤压图像并且超过零。

于 2012-04-27T22:29:12.363 回答
6

由于这里的参数是

CATransform3DScale (CATransform3D t, CGFloat sx, CGFloat sy, CGFloat sz)

如果要水平翻转,则不应在 CATransform3DMakeRotation() 中提供任何向量值。相反,您只想控制 x 轴的比例。

通过水平翻转它,您应该:

self.transform = CATransform3DScale(CATransform3DMakeRotation(0, 0, 0, 0),
                                        -1, 1, 1);

如果要将其翻转回原点,请执行以下操作:

self.transform = CATransform3DScale(CATransform3DMakeRotation(0, 0, 0, 0),
                                        1, 1, 1);  

另外:
较短的版本将为您节省一项操作。反转:

self.transform = CATransform3DMakeRotation(M_PI, 0, 1, 0);

要恢复正常:

self.transform = CATransform3DMakeRotation(0, 0, 1, 0);
于 2013-07-17T04:50:27.510 回答
4

我个人觉得使用 KVC 来处理这些事情更具可读性。您可能可以使用以下内容来达到相同的效果:

// Rotate the layer 90 degrees to the left
[self.customLayer setValue:@-1.5707 forKeyPath:@"transform.rotation"];
// Flip the layer horizontally
[self.customLayer setValue:@-1 forKeyPath:@"transform.scale.x"];
于 2013-01-04T11:20:36.177 回答