2011-11-27 59 views
2

我有一个CATransform3DMakeRotation奇怪的问题。当旋转视图在上海华的中心,它看起来像这样:奇怪的角度与CATransform3DMakeRotation

Valid XHTML http://i1183.photobucket.com/albums/x467/Laurin_Koppenwallner/Bildschirmfoto2011-11-27um181544.png

这是它应该如何看。然而,当它在其他地方在上海华,比如说,在左下角,它看起来像这样:

Valid XHTML http://i1183.photobucket.com/albums/x467/Laurin_Koppenwallner/Bildschirmfoto2011-11-27um181627.png

。注意,向右侧倾斜。同样的事情发生在右下角时,只会向左倾斜。有什么方法可以让它随时随地倾斜吗?实现这种转换的代码如下:

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"]; 
+0

您可能没有正确构建您的CATransform3D,很可能是因为忘记了翻译和旋转会相互影响。发布您用于生成转换的代码。 –

+0

@RobNapier包含代码 – kopproduction

回答

3

你已经在上海华盈的层应用的角度来看,这是你在说什么。如果您希望基于各个子层的视角(不考虑总体视角),那么您必须单独应用视角。例如:

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"]; 

在本例中,我申请在fromValue和该层的两个toValue透视(m34)。这会给你一个相对于站在图层本身前面的观察者的视角。你原来的代码有一个观察者站在视图中心的前方,所以你会看到一些偏斜的视角。

我在这里做了一些其他的小改动。我通常把观察者的数量设置为2000而不是1000.我发现1000的观点通常比期望的要多(除非你主动寻求强烈的观点)。根据你的问题,你可能想完全摆脱视角。不要仅仅因为习惯而使用它。

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