【问题标题】:Swift : CABasicAnimation Issue斯威夫特:CABasicAnimation 问题
【发布时间】:2016-01-13 05:58:38
【问题描述】:

您在下面看到的代码创建了一个 CALayer(矩形形状),并在用户按住屏幕longPressGestureRecognizer 时从左到右对其进行动画处理。当他们抬起手指时,CALayer 停止动画,它被推入一个数组,当他们再次按住屏幕时,另一个 CALayer 被创建。您可以直接在新项目中复制粘贴代码:

 //Global Variables
var layer: CALayer?
var holdGesture = UILongPressGestureRecognizer()
let animation = CABasicAnimation(keyPath: "bounds.size.width")
var layerHolder = [CALayer]()
var endPoint : CGFloat = 0


func setUpView(){

    self.view.addGestureRecognizer(holdGesture)
    holdGesture.addTarget(self, action:"handleLongPress:")

}


func handleLongPress(sender : UILongPressGestureRecognizer){
    print("inside handlelong press")

    let newLayer = CALayer()

    if(sender.state == .Began) {

        newLayer.frame = CGRect(x: 0, y: 0, width: 0, height: 10)
        newLayer.backgroundColor = UIColor.redColor().CGColor

        if(layerHolder.count >= 1){
            newLayer.frame.origin.x = endPoint
        }

        animation.fromValue = endPoint
        animation.toValue = self.view.bounds.width * 2
        animation.duration = 30
        self.view.layer.addSublayer(newLayer)

        print("Long Press Began")
        newLayer.addAnimation(animation, forKey: "bounds.size.width")

        layer = newLayer
    }


    else {
        print("Long press ended")

        if let layer = layer {
            print("width is: \(layer.presentationLayer()?.bounds.width)")
            print("Total Width is \(self.view.bounds.width * 2)")
            pauseLayer(layer)
            layerHolder.append(layer)

            endPoint += (layer.presentationLayer()?.bounds.width)!
            print("endPoint is: \(endPoint)")
        }

    }


}


func pauseLayer(layer : CALayer){
    let pausedTime : CFTimeInterval = layer.convertTime(CACurrentMediaTime(), fromLayer: nil)
    layer.speed = 0.0
    layer.timeOffset = pausedTime

}

所以我想要做的是获取第一个 CALayer 的宽度,我使用 layer.presentationLayer()?.bounds.width 进行此操作,并将其作为创建的下一个 CALayer 的“x”点。效果看起来像是一个连续的条,但实际上它是一堆并排放置的 CALayer。这似乎没问题。

但是,问题是当创建下一个 CALayer 时,它看起来好像宽度设置不是 0(我需要它为 0),而是所有 CALayer 的长度。所以它只是突然出现,然后开始动画。我一直在试图弄清楚为什么几个小时,有人可以帮忙吗!?

更新:我认为它翻倍的原因是因为layer.presentationLayer()?.bounds.width 没有被重置为 0,所以它总是被添加到。

【问题讨论】:

    标签: ios swift calayer cabasicanimation


    【解决方案1】:

    使用这个更新的代码:

            //Global Variables
        var layer: CALayer?
        var holdGesture = UILongPressGestureRecognizer()
        let animation = CABasicAnimation(keyPath: "bounds.size.width")
        var nextXOffset = CGFloat(0.0)
    
    
        func setUpView(){
    
            self.view.addGestureRecognizer(holdGesture)
            holdGesture.addTarget(self, action:"handleLongPress:")
    
        }
    
        func handleLongPress(sender : UILongPressGestureRecognizer){
    
            if(sender.state == .Began) {
    
                let newLayer = CALayer()
                newLayer.frame = CGRect(x: nextXOffset, y: 0, width: 0, height: 10)
                newLayer.backgroundColor = UIColor.redColor().CGColor
    
                animation.fromValue = 0
                animation.toValue = self.view.bounds.width * 2 - nextXOffset
                animation.duration = 5
                self.view.layer.addSublayer(newLayer)
    
                print("Long Press Began")
                newLayer.addAnimation(animation, forKey: "bounds.size.width")
    
                layer = newLayer
            }
            else {
                print("Long press ended")
    
                if let layer = layer {
    
                    pauseLayer(layer)
                    layer.frame = layer.presentationLayer()!.frame
                    nextXOffset = CGRectGetMaxX(layer.frame)
    //                layer.removeFromSuperlayer()
                }
            }
        }
    
        func pauseLayer(layer : CALayer){
            let pausedTime : CFTimeInterval = layer.convertTime(CACurrentMediaTime(), fromLayer: nil)
            layer.speed = 0.0
            layer.timeOffset = pausedTime
    
        }
    

    【讨论】:

    • 他又来了,女士们先生们!
    • Hey Arun,有没有办法检查图层右侧是否接触到屏幕右侧。基本上,当栏已满时(从左到右),我需要停止动画并调用一个函数。
    • 如果 nextXOffset >= self.view.bounds.width * 2
    • 哦,真的!我在哪里实现呢??
    • 这一行之后:nextXOffset = CGRectGetMaxX(layer.frame)
    猜你喜欢
    • 1970-01-01
    • 2017-07-22
    • 2017-03-24
    • 2015-08-02
    • 2018-02-10
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 2016-02-08
    相关资源
    最近更新 更多