2016-01-13 6 views
0

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

//Global Variables 
var layer: CALayer? 
var holdGesture = UILongPressGestureRecognizer() 
let animation = CABasicAnimation(keyPath: "bounds.size.width") 
var layerHolder = [CALayer]() 
var widthIndex = CGPoint(x: 0, y: 0) 
var nextXOffset = CGFloat(0.0) 
var checkIfFull = CGFloat() 
var colorIndex : Int = 0 
let barColors = [ 
    //Red 
    UIColor(red: 0.969, green: 0.49, blue: 0.443, alpha: 1), 
    //Orange 
    UIColor(red: 0.984, green: 0.647, blue: 0.431, alpha: 1), 
    //Pink 
    UIColor(red: 0.894, green: 0.592, blue: 0.698, alpha: 1), 
    //Purple 
    UIColor(red: 0.851, green: 0.6, blue: 0.957, alpha: 1), 
    //Yellow 
    UIColor(red: 0.98, green: 0.875, blue: 0.455, alpha: 1), 
    //Green 
    UIColor(red: 0.49, green: 0.792, blue: 0.616, alpha: 1), 
    //Blue 
    UIColor(red: 0.553, green: 0.71, blue: 0.906, alpha: 1)] 



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 = barColors[colorIndex % 7].CGColor 

     print("before \(nextXOffset)") 
     newLayer.anchorPoint = widthIndex 
     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 { 
      print("after \(nextXOffset)") 

      pauseLayer(layer) 

      layer.frame = layer.presentationLayer()!.frame 
      nextXOffset = CGRectGetMaxX(layer.frame) 
      layerHolder.append(layer) 

      colorIndex++ 

     } 
    } 
} 

Моя проблема заключается в том, что, когда новый CALayer создается и анимации, он растет с обеих сторон не только растущих вправо. Мне нужно, чтобы они были бок о бок друг с другом, один двигался вправо, где другой остановился. Я не замечал этого, пока я не обменял цвета. После некоторых исследований, я считаю, установка точки привязки, откуда последний CALayer кончил правильный подход. Я пытался добиться этого, но не смог этого сделать. Помоги мне? Пожалуйста?

UPDATE: Я считаю, что если бы я должен был использовать nextXOffset в качестве точки привязки, я могу быть в состоянии сделать это, но это типа CGFloat не CGPoint. Помоги пожалуйста!

ответ

0

Это работает, я настолько тупой. Удержание «widthIndex» в (0,0) позволяет ему начинать, когда последний бар прекратился. Код работает.

Смежные вопросы