【问题标题】:How to translate and animate CALayer on Z-Axis?如何在 Z 轴上平移和动画 CALayer?
【发布时间】:2015-04-20 11:39:56
【问题描述】:

我正在尝试在 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 轴吗?

【问题讨论】:

  • 您似乎没有任何透视,因此当图层沿 z 轴移动时您不会看到任何变化
  • 我发现 CALayer 将自身投影到 Z = 0 上(我不知道这句话在技术上是否正确,希望它有意义)。所以,我发现了 CATransformLayer。但是,我仍然不知道如何制作动画。如何设置视角?

标签: ios core-animation calayer


【解决方案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
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 2021-09-11
    • 2011-11-05
    • 2014-11-23
    • 2010-09-18
    相关资源
    最近更新 更多