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
做的宽度和有是的“X”点下一个创建的CALayer。效果看起来像是一个连续的酒吧,但它真的是一堆被放置在彼此旁边的CALayers。这似乎很好。
但是,问题是当下一个CALayer被创建时,它看起来好像宽度不是0(我需要它是0),而是所有CALayers的长度。所以它只是弹出视图,然后开始动画。我一直在努力弄清楚为什么几个小时,有人可以帮忙!?
UPDATE:我相信为什么它的倍增原因是因为layer.presentationLayer()?.bounds.width
没有被重置为0,所以它总是被添加到。
而且他也再次女士们先生们! – OriginalAlchemist
嘿Arun,有没有办法检查图层的右侧是否触及了屏幕的右侧。基本上,当酒吧已满(从左到右),我需要停止动画并调用一个函数。 – OriginalAlchemist
if nextXOffset> = self.view.bounds.width * 2 –