Swift : 在 CABasicAnimation 上设置锚点
Swift : Set anchor Point on CABasicAnimation
您在下面看到的代码创建了一个 CALayer(矩形)并在用户按住屏幕时从左到右对其进行动画处理 ('longPressGestureRecognizer')。当他们抬起手指时,CALayer 停止动画,它被推入一个数组,当他们再次按住屏幕时,另一个 CALayer 被创建。您可以在新项目中直接复制粘贴代码:
//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。请帮忙!
这行得通,我太笨了。将 'widthIndex' 保持在 (0,0) 允许它从最后一个小节停止的地方开始。代码有效。
您在下面看到的代码创建了一个 CALayer(矩形)并在用户按住屏幕时从左到右对其进行动画处理 ('longPressGestureRecognizer')。当他们抬起手指时,CALayer 停止动画,它被推入一个数组,当他们再次按住屏幕时,另一个 CALayer 被创建。您可以在新项目中直接复制粘贴代码:
//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。请帮忙!
这行得通,我太笨了。将 'widthIndex' 保持在 (0,0) 允许它从最后一个小节停止的地方开始。代码有效。