1

我想将视图从平行于地面的平面转换为垂直于地面的平面。

有任何想法吗?

4

1 回答 1

0

要在 3D 中旋转视图,您需要修改transform视图层的属性。

听起来您想围绕 X 轴旋转视图。我猜你想要透视,靠近观察者的边缘看起来更大,远离观察者的边缘看起来更小。

我们将编写一个辅助函数来进行转换。我们从恒等变换开始:

static CATransform3D transformWithAngle(CGFloat angle) {
    CATransform3D transform = CATransform3DIdentity;

然后m34根据观察者到视图的距离设置变换的分量:

    transform.m34 = -1.0f / 300.0f;

如果使用大于 的数字300,则透视会较弱。如果使用小于 的数字300,则透视效果会更强。

接下来,添加旋转:

    transform = CATransform3DRotate(transform, angle, 1, 0, 0);

然后返回变换:

    return transform;
}

假设您要将其应用于名为self.riseView. 您可能希望旋转围绕视图的底部边缘,因此将图层的锚点设置为底部边缘:

- (void)viewDidLoad {
    CGRect frame = self.riseView.frame;
    self.riseView.layer.anchorPoint = CGPointMake(0.5f, 1.0f);
    self.riseView.frame = frame;

并以 0 的角度初始化图层的变换:

    self.riseView.layer.transform = transformWithAngle(0);
}

您可以通过将视图旋转到以下角度来“设置”视图(向下旋转到地平面)-M_PI_2

- (IBAction)setButtonWasTapped:(id)sender {
    [self animateRiseViewToAngle:-M_PI_2];
}

您可以通过将其旋转到零角度使其“上升”(向上旋转):

- (IBAction)riseButtonWasTapped:(id)sender {
    [self animateRiseViewToAngle:0];
}

以下是我们实际制作动画的方式:

- (void)animateRiseViewToAngle:(CGFloat)angle {
    [UIView animateWithDuration:2 animations:^{
        self.riseView.layer.transform = transformWithAngle(angle);
    }];
}
于 2013-05-26T18:06:40.967 回答