2015-04-20 20 views
1

我正在嘗試在Z軸上翻譯CALayer,以便讓用戶更接近屏幕的感覺。但我無法讓它工作。這裏是我的代碼:如何在Z軸上翻譯和動畫CALayer?

func createCircle(size : CGFloat, color : UIColor) { 
    let layer = CALayer(); 
    let parentLayer = self.visualView.layer; 

    // layer testing properties 
    layer.backgroundColor = color.CGColor; 
    layer.cornerRadius = size/2.0; 
    layer.borderWidth = 2.0; 
    layer.frame = CGRectMake(CGFloat(arc4random() % uint(parentLayer.frame.width)), CGFloat(arc4random() % uint(parentLayer.frame.height)), size, size);  


    // transform properties 
    let identity = CATransform3DIdentity; 

    // have tried both -50 and +50 for the Z-Axis and got nothing. 
    layer.transform = CATransform3DTranslate(identity, 0, 0, 50); 

    // animation 
    let animationGroup = self.createAnimationForLayer(layer); 

    layer.addAnimation(animationGroup, forKey: nil); 
    parentLayer.addSublayer(layer); 
} 

func createAnimationForLayer(layer : CALayer) -> CAAnimationGroup { 
    let transformChange = CABasicAnimation(keyPath: "transform"); 
    transformChange.fromValue = NSValue(CATransform3D: layer.transform); 
    transformChange.toValue = NSValue(CATransform3D: CATransform3DIdentity); 

    let animationGroup = CAAnimationGroup(); 
    animationGroup.animations = [transformChange]; 
    animationGroup.duration = 1.0; 
    animationGroup.delegate = self; 
    animationGroup.setValue(layer, forKey: "animationLayer"); 
    animationGroup.fillMode = kCAFillModeForwards; 
    return animationGroup; 
} 

翻譯根本沒有發生。該對象不會移動。我想也許問題出在翻譯本身,但如果我給X或Y的價值,對象會移動。我不能在CALayer中使用Z軸嗎?

+0

的你似乎沒有任何的角度,所以你不會看到任何變化,當沿z層移動-axis –

+0

我發現CALayer將自己投射到Z = 0(我不知道這句話在技術上是否正確,並希望它有道理)。所以,我發現了CATransformLayer。但是,我仍然不知道如何製作動畫。我如何設定一個觀點? – Gasim

回答

1
  1. 添加透視投影:m34 = -1.0/d其中d是虛擬相機和屏幕之間的距離。

  2. 設置sublayerTransform的角度來看適用於所有的子層

    var transform = CATransform3DIdentity 
    transform.m34 = -1.0/500.0 
    self.visualView.layer.transform = transform 
    self.visualView.layer.sublayerTransform = transform