2016-01-13 2 views
0

Код, который вы видите ниже, создает CALayer (форму прямоугольника) и анимирует его слева направо, когда пользователь удерживает на экране longPressGestureRecognizer. Когда они поднимают свой палец, CALayer останавливает анимацию, он попадает в массив, и когда они удерживаются на экране, создается еще один CALayer. Вы можете скопировать и вставить код непосредственно в новом проекте:Swift: CABasicAnimation Issue

//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. Эффект будет выглядеть так, как будто это сплошной бар, но на самом деле его куча CALayers размещена рядом друг с другом. Кажется, все в порядке.

Однако проблема заключается в том, что при создании следующего CALayer он выглядит так, как если бы ширина была не равной 0 (что мне нужно, чтобы оно было 0), но и длиной всех CALayers. Таким образом, он просто появляется в поле зрения, а затем начинает анимацию. Я пытался выяснить, почему часами, может кто-то помочь, пожалуйста !?

ОБНОВЛЕНИЕ: Я считаю, причина, почему его удвоение происходит потому, что layer.presentationLayer()?.bounds.width не сбрасывается до 0, поэтому его всегда добавляется.

ответ

0

Используйте этот обновленный код:

 //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 

    } 
+0

И он делает это снова ДАМЫ И ГОСПОДА! – OriginalAlchemist

+0

Эй, Арун, есть способ проверить, коснулась ли правая сторона слоя справа от экрана. В основном, когда полоса заполнена (идет слева направо), мне нужно остановить анимацию и вызвать функцию. – OriginalAlchemist

+0

если следующийXOffset> = self.view.bounds.width * 2 –