2016-01-11 3 views
0

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

var l = CALayer() 
var holdGesture = UILongPressGestureRecognizer() 
let animation = CABasicAnimation(keyPath: "bounds.size.width") 

override func didReceiveMemoryWarning(){ 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 
override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    setUpView() 

} 

func setUpView(){ 
    l.frame = CGRect(x: 0, y: 0, width: 0, height: 10) 
    l.backgroundColor = UIColor.redColor().CGColor 

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

} 

func handleLongPress(sender : UILongPressGestureRecognizer){ 

    //User is holding down on screen 
    if(sender.state == .Began){ 
    print("Long Press Began") 
    animation.fromValue = 0 
    animation.toValue = self.view.bounds.maxX * 2 
    animation.duration = 30 
    self.view.layer.addSublayer(l) 
    l.addAnimation(animation, forKey: "bounds.size.width") 

    } 

    //User lifted Finger  
    else{ 
     print("Long press ended") 
     print("l width: \(l.bounds.size.width)") 
     pauseLayer(l) 
    } 
} 

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

} 

У меня есть два вопроса:

1) Когда я напечатать ширину CALayer после анимации (когда пользователь поднимает палец) его всегда 0. анимировать ширину, и его расширения, таким образом, я не знаю, почему он не дает мне новую ширину CALayer.

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

UPDATE to issue # 2: Я считаю, что для создания другого CALayer я не могу просто добавить слой снова, я должен либо создать копию, либо создать UIView, к которому я могу добавить слой. Я все еще не понимаю, почему он исчезает.

+0

Перед тем, как оживить его, вы должны установить целевую привязку к слою. – Shripada

+0

Спасибо за ответ! Что именно ты имеешь ввиду? Не могли бы вы ответить на вопрос? Некоторые говорили, что я должен создать копию CALayer. @Shripada – OriginalAlchemist

+0

Я попытался ответить, проверьте это - @ originalAlchemist – Shripada

ответ

2

В основном вы пытаетесь изменить размер слоя при удержании пользователя. Вот функция, которая может быть использована для изменения размера данного слоя:

Если вы хотите происхождение, чтобы быть привязанными к левому, вам нужно будет установить якорь слоя первым:

layer.anchorPoint = CGPointMake(0.0, 1); 

func resizeLayer(layer:CALayer, newSize: CGSize) { 

    let oldBounds = layer.bounds; 
    var newBounds = oldBounds; 
    newBounds.size = size; 


    //Ensure at the end of animation, you have proper bounds 
    layer.bounds = newBounds 

    let boundsAnimation = CABasicAnimation(keyPath: "bounds") 
    positionAnimation.fromValue = NSValue(CGRect: oldBounds) 
    positionAnimation.toValue = NSValue(CGRect: newBounds) 
    positionAnimation.duration = 30 
} 

В вашем Случай, я не уверен, где вы возобновляете приостановленный слой. Также наблюдайте каждый раз, когда пользователь нажимает, новая анимация добавляется в ваш метод handleLongPress! и это будет иметь нежелательный эффект. В идеале вам нужно начать анимацию только в первый раз, а затем просто возобновить приостановленную анимацию, которую вы начали раньше.

//Flag that holds if the animation already started.. 
var animationStarted = false 

func handleLongPress(sender : UILongPressGestureRecognizer){ 

    //User is holding down on screen 
    if(sender.state == .Began){ 

    if(animationStarted == false){ 
     let targetBounds = CalculateTargetBounds() //Implement this to your need 
     resizeLayer(layer, targetBounds) 
     animationStarted = true 
    }else { 
     resumeLayer(layer) 
    } 
    }else { 
    pauseLayer(layer) 
    } 
} 
+0

Это потрясающе! Спасибо! Единственное, что я хочу создать новый слой каждый раз, когда пользователь держится. Происхождение следующего слоя будет от того места, где остался последний слой, он будет выглядеть как один непрерывный бар, но его действительно несколько расположены рядом друг с другом. Причина, по которой я делаю это, - это то, что я сохраняю их в массиве и могу их удалить при необходимости. Мне нужно отслеживать каждую задержку и время, в течение которого он появляется, а затем удалять его, если необходимо (не беспокойтесь об удалении). Пожалуйста, помогите !! – OriginalAlchemist

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

  • Нет связанных вопросов^_^