Код, который вы видите ниже, создает 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, поэтому его всегда добавляется.
И он делает это снова ДАМЫ И ГОСПОДА! – OriginalAlchemist
Эй, Арун, есть способ проверить, коснулась ли правая сторона слоя справа от экрана. В основном, когда полоса заполнена (идет слева направо), мне нужно остановить анимацию и вызвать функцию. – OriginalAlchemist
если следующийXOffset> = self.view.bounds.width * 2 –