gpt4 book ai didi

ios - 更改 slider 上的动画速度

转载 作者:行者123 更新时间:2023-11-28 21:14:55 25 4
gpt4 key购买 nike

如果滚动到底部,您会看到一个用于更改动画速度的 slider 。我想做的是基于 replicatorLayer animation2() 部分在 slider 上创建动画速度。这可能吗?

var player:AVAudioPlayer = AVAudioPlayer()
var meditationState: MeditationState?
var replicatorLayer = CAReplicatorLayer()
var dot = CALayer()

func updateTimer(){

seconds += 1
timerclock.text = "\(seconds)"
}

// Animation starts running

func animation2() {

// A layer that creates a specified number of copies of its sublayers (the source layer), each copy potentially having geometric, temporal, and color transformations applied to it.
replicatorLayer = CAReplicatorLayer()

// The layer’s bounds rectangle. Animatable.
replicatorLayer.bounds = CGRect(x: 0.0, y: 0.0, width: 300.0, height: 300.0)

// The radius to use when drawing rounded corners for the layer’s background. Animatable.
replicatorLayer.cornerRadius = 10.0

// The background color of the receiver. Animatable.
replicatorLayer.backgroundColor = UIColor(white: 0.0, alpha: 0.0).cgColor

// The layer’s position in its superlayer’s coordinate space. Animatable.
replicatorLayer.position = view.center

// calling this method creates an array for that property and adds the specified layer to it.
view.layer.addSublayer(replicatorLayer)


// connectng the animation to the content

// An object that manages image-based content and allows you to perform animations on that content
dot = CALayer()

// The layer’s bounds rectangle. Animatable.
dot.bounds = CGRect(x: 0.0, y: 0.0, width: 12.0, height: 12.0)

//The layer’s position in its superlayer’s coordinate space. Animatable.
dot.position = CGPoint(x: 150.0, y: 40.0)

//The background color of the receiver. Animatable.
dot.backgroundColor = UIColor(white: 0.2, alpha: 1.0).cgColor

// The color of the layer’s border. Animatable.
dot.borderColor = UIColor(white: 1.0, alpha: 1.0).cgColor

// The width of the layer’s border. Animatable.
dot.borderWidth = 1.0

//The radius to use when drawing rounded corners for the layer’s background. Animatable.
dot.cornerRadius = 5.0


//Appends the layer to the layer’s list of sublayers.
replicatorLayer.addSublayer(dot)

// number of copies of layer is instanceCount

let nrDots: Int = 1000

//The number of copies to create, including the source layers.
replicatorLayer.instanceCount = nrDots

// The basic type for floating-point scalar values in Core Graphics and related frameworks.
let angle = CGFloat(2*M_PI) / CGFloat(nrDots)

// The transform matrix applied to the previous instance to produce the current instance. Animatable.
replicatorLayer.instanceTransform = CATransform3DMakeRotation(angle, 0.0, 0.0, 1.0)

// Type used to represent elapsed time in seconds.
let duration: CFTimeInterval = 10.0

// animation capabilities for a layer property.

// An object that provides basic, single-keyframe animation capabilities for a layer property.
let shrink = CABasicAnimation(keyPath: "transform.scale")

// Defines the value the receiver uses to start interpolation.
shrink.fromValue = 1.0

// Defines the value the receiver uses to end interpolation.
shrink.toValue = 0.1

// Specifies the basic duration of the animation, in seconds.
shrink.duration = duration

// Determines the number of times the animation will repeat.
shrink.repeatCount = Float.infinity

// Add the specified animation object to the layer’s render tree.
dot.add(shrink, forKey: "shrink")

// Specifies the delay, in seconds, between replicated copies. Animatable.
replicatorLayer.instanceDelay = duration/Double(nrDots)

// The transform applied to the layer’s contents. Animatable.
dot.transform = CATransform3DMakeScale(0.01, 0.01, 0.01)
}

// connecting the breathe in label

@IBOutlet weak var label: UILabel!

// instant delay

@IBOutlet weak var instantDelay: UIButton!
@IBAction func delayBtn(_ sender: Any) {

dot.removeAnimation(forKey: "shrink")
timer1.invalidate()
seconds = 0
timer2.invalidate()
timerclock.text = "\(seconds)"
time = 0
timerLabel.text = "Breathe in"
timerisOn = false
pauseBtn.isHidden = true
playBtn.isHidden = false

label.isHidden = true
replicatorLayer.isHidden = true
instantDelay.isHidden = true
instantDelay1.isHidden = false
slider.isHidden = false
}

// Delay 1

@IBOutlet weak var instantDelay1: UIButton!
@IBAction func delayBtn1(_ sender: Any) {


instantDelay1.isHidden = true
instantDelay.isHidden = false
label.isHidden = false
slider.isHidden = true
}


//Slider for changing animation speed

@IBOutlet weak var slider: UISlider!
@IBAction func slider(_ sender: Any) {

}

最佳答案

CALayer 符合CAMediaTiming 协议(protocol),这意味着它有一个speed 属性。当您更改图层的 speed 属性时,它会更改所有子图层的“参照系”。 (speed == 1.0为正常速度,speed 2.0为倍速,speed 0.5为半速。)

您可以更改包含复制器层的父层的 speed 属性,它会改变动画的速度。尝试制作一个附加到 slider 的 valueChanged IBAction,将动画 super 层的速度属性更改为 0.5 到 2.0 之间的值。

CAAnimation 对象也符合 CAMediaTiming 协议(protocol),因此您也可以更改单个动画的速度。

编辑:

并不复杂。你可以使你的 slider IBAction 方法像这样:

@IBAction func slider(_ sender: UISlider) {
view.layer.speed = sender.value
}

关于ios - 更改 slider 上的动画速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41663789/

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