gpt4 book ai didi

Swift - 当按下按钮时,如果动画已经在播放,则将动画重置为开始

转载 作者:行者123 更新时间:2023-11-30 10:50:53 24 4
gpt4 key购买 nike

我在以编程方式创建的按钮上有一个径向动画,按下按钮时会出现该动画。

如果在动画已经运行时按下按钮,我希望动画在开始时重置并自动再次播放。

在“animationDidStop”函数中,我有在动画完成时应用的代码。我遇到的问题是当按下按钮并且动画已经在运行时。我无法删除正在运行的动画并启动新的动画,因为它调用“animationDidStop”。我还不想调用它。

我的想法是调整附加到径向形状的动画值,但这在计划中不起作用。我知道可以访问动画值,但我要更改哪一个,因为“fromValue”没有显示。我什至不知道这是否真的有效或更好的方法。我已经被困了一段时间了。

 var shapeLayerArray: [CustomShapeLayer] = []

func AutoUpRadial(button: CustomBtn, height: Int, value: Int){

let trackLayer = CustomShapeLayer()

let radius = height / 3
let circularPath = UIBezierPath(arcCenter: button.center, radius: CGFloat(radius), startAngle: 0, endAngle: 2 * CGFloat.pi, clockwise: true)
trackLayer.path = circularPath.cgPath

trackLayer.strokeColor = UIColor.black.cgColor
trackLayer.opacity = 0.3
trackLayer.fillColor = UIColor.clear.cgColor
trackLayer.lineWidth = 5
trackLayer.strokeEnd = 0

mainScrollView.layer.addSublayer(trackLayer)

autoUpFillRadial(value: value, tmpBtn: button, shape: trackLayer)


shapeLayerArray.append(trackLayer)
}

@objc private func autoUpFillRadial(value: Int, tmpBtn: CustomBtn, shape: CustomShapeLayer){

let basicAnimation = CABasicAnimation(keyPath: "strokeEnd")
basicAnimation.fromValue = 0
basicAnimation.toValue = 1
basicAnimation.duration = CFTimeInterval(value)
basicAnimation.fillMode = .forwards
basicAnimation.isRemovedOnCompletion = true
basicAnimation.setValue(tmpBtn.UUIDtag, forKey: "animationID")
basicAnimation.delegate = self

shape.add(basicAnimation, forKey: "basic")
}

func animationDidStop(_ anim: CAAnimation, finished flag: Bool) {

if let tag = anim.value(forKey: "animationID") as? UUID {
if let tmpButton: CustomBtn = tmpButtonPicked(uuid: tag) {
tmpButton.isSelected = false
actionInput(sender: tmpButton, act: "up")
}
}
}

下面是按钮脚本

@IBAction func clipButton(sender: CustomBtn){

currentSelectedMarkerUUID = sender.UUIDtag

if let marker = markUpPlist.arrayObjects.filter({$0.UUIDpic == currentSelectedMarkerUUID}).first {

if recording {
if sender.isSelected {

if !shapeLayerArray.isEmpty {
for shape in shapeLayerArray {
if shape.uuidTag == marker.UUIDpic {

print(shape.animation(forKey: "basic"))
// The line aboves shows the animation data

sender.isSelected = true
} else {
sender.isSelected = false
endClip(sender: sender)
}
}
} else if shapeLayerArray.isEmpty {
sender.isSelected = false
endClip(sender: sender)
}

} else if !sender.isSelected {

sender.isSelected = true
startClip(sender: sender)


if marker.timeAutoUp > 0 {

if !shapeLayerArray.isEmpty {
for shape in shapeLayerArray {
if shape.uuidTag == marker.UUIDpic {

//DO SOMETHING

} else {
self.AutoUpRadial(button: sender, height: marker.height, value: marker.timeAutoUp)
}
}
} else if shapeLayerArray.isEmpty {

self.AutoUpRadial(button: sender, height: marker.height, value: marker.timeAutoUp)
}
}
} else {
sender.isSelected = false
}
}
}
}

class CustomShapeLayer: CAShapeLayer {
var uuidTag: UUID?
}

回顾一下,如果按下按钮时动画已经在播放但不调用animationDidStop函数,我希望能够重置动画。

我尝试删除尽可能多与代码无关的内容,以尽可能地压缩它。希望这是有道理的。感谢您的任何建议

最佳答案

经过几个小时的坚持,我想出了这个。我在自定义 CAshapelayer 中添加了一个重置​​ bool 值。当按下按钮并且动画已经运行时,将调用重置 bool 值。

class CustomShapeLayer: CAShapeLayer {
var uuidTag: UUID?
vart reset = false
}

func animationDidStop(_ anim: CAAnimation, finished flag: Bool) {

if let tag = anim.value(forKey: "animationID") as? UUID {
if let tmpButton: CustomBtn = tmpButtonPicked(uuid: tag) {

if !shapeLayerArray.isEmpty {
for shape in shapeLayerArray {
if shape.uuidTag == tag{
if shape.reset {
shape.reset = false
} else {
tmpButton.isSelected = false
actionInput(sender: tmpButton, act: "up")
}
} else {
tmpButton.isSelected = false
actionInput(sender: tmpButton, act: "up")
}
}
} else if shapeLayerArray.isEmpty {

tmpButton.isSelected = false
actionInput(sender: tmpButton, act: "up")
}
}
}
}

关于Swift - 当按下按钮时,如果动画已经在播放,则将动画重置为开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54565989/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com