2011-11-27 63 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將始終返回舊值,而不是當前值。如果您將更多的動畫應用於此圖層,這也會使事情變得複雜。這就是爲什麼默認是在完成時刪除動畫的原因。