首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CATransform3DMakeRotation的怪异视角

CATransform3DMakeRotation的怪异视角
EN

Stack Overflow用户
提问于 2011-11-28 01:31:59
回答 1查看 1.1K关注 0票数 2

我和CATransform3DMakeRotation有个奇怪的问题。当旋转视图位于superview的中心时,它看起来如下所示:

这是它应该看起来的样子。但是,当它在superview中的其他位置时,比如在左下角,它看起来像这样:

请注意,它向右倾斜。当它在右下角时也会发生同样的事情,只是它向左倾斜。有没有什么方法可以让它在所有时间和每个位置都以它应该的方式倾斜?实现此转换的代码如下所示:

代码语言:javascript
复制
    CALayer *layer = view.layer;

    CATransform3D aTransform = CATransform3DIdentity;
    float zDistance = 1000;
    aTransform.m34 = 1.0 / -zDistance;  

    self.view.layer.sublayerTransform = aTransform;


    CABasicAnimation *rotateAnim = [CABasicAnimation animationWithKeyPath:@"transform"];
    rotateAnim.fromValue= [NSValue valueWithCATransform3D:CATransform3DMakeRotation(0, 0, 0, 0)];
    rotateAnim.duration=0.12;
    rotateAnim.toValue=[NSValue valueWithCATransform3D:CATransform3DMakeRotation(20*M_PI/180, 1, 0, 0)];

    rotateAnim.removedOnCompletion = NO;
    rotateAnim.fillMode = kCAFillModeForwards;
    [layer addAnimation:rotateAnim forKey:@"rotateAnim"];
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-28 03:52:46

你已经在superview的层应用了透视,这就是你所得到的。如果您想要基于单个子层的透视(而不考虑整体透视),那么您必须将透视应用于各个子层。例如:

代码语言:javascript
复制
CALayer *layer = view.layer;

CATransform3D aTransform = CATransform3DIdentity;
CGFloat zDistance = 2000.;
aTransform.m34 = 1.0 / -zDistance;  

CABasicAnimation *rotateAnim = [CABasicAnimation animationWithKeyPath:@"transform"];

rotateAnim.fromValue= [NSValue valueWithCATransform3D:aTransform];
aTransform = CATransform3DRotate(aTransform, 20*M_PI/180, 1, 0, 0);;
rotateAnim.duration=0.12;
rotateAnim.toValue=[NSValue valueWithCATransform3D:aTransform];
layer.transform = aTransform;

[layer addAnimation:rotateAnim forKey:@"rotateAnim"];

在本例中,我在层的fromValuetoValue中都应用了透视(m34)。这就给了你相对于站在图层前面的观察者的视角。您的原始代码有一个观察者站在视图中心的前面,因此您得到了一些倾斜的透视图。

我在这里做了一些其他的小改动。我通常认为观察者是2000而不是1000。我发现1000的透视率通常比期望的要高(除非你积极地追求强大的透视率)。根据您的问题,您可能希望完全摆脱透视。不要仅仅出于习惯而使用它。

更重要的是,我改变了你在最后应用动画的方式。使用removedOnCompletion=NOkCAFillModeForwards使事情变得更加复杂,而不仅仅是将动画应用于模型(layer.transform=aTransform)并正常删除动画。特别是,使用removedOnCompletion=NO意味着以后对layer.transform的请求将始终返回旧值,而不是当前值。如果你将更多的动画应用到这一层,这也会使事情变得复杂。这就是为什么默认情况下在完成时删除动画的原因。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8287496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档