如何让图像在 Swift 中自行移动?
How do I make an image move on its own in Swift?
这是我的代码,用于让我的图像在被点击时随机移动(使用手势识别器)。
但我希望这种情况不断自动发生,它自己不停地移动。
let x = Int.random(in: 0...275)
let y = Int.random(in: 210...565)
UIView.animate(withDuration: 0, delay: 0, options: .curveLinear, animations: {
self.randomView.center.y = CGFloat(y)
self.randomView.center.x = CGFloat(x)
}, completion: nil)
如果需要,我可以分享 ViewController 文件中的完整代码。
在回答您的问题时,您可以递归调用该方法,但有延迟。
话虽这么说,但您似乎一点也不生气。如果你只是想将它移动到不同的位置,你可以这样做:
weak var timer: Timer?
func moveToRandomLocation() {
let x = Int.random(in: 0...275)
let y = Int.random(in: 210...565)
randomView.center = CGPoint(x: x, y: y)
timer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: false) { [weak self] _ in
self?.moveToRandomLocation()
}
}
它移动了,半秒后,它自己调用了。而 [weak self]
捕获列表避免了强引用循环。我使用 Timer
计时器 invalidate
那个计时器你应该停止它。
或者,只需使用重复的 Timer
:
weak var timer: Timer?
func startMovingToRandomLocations() {
timer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true) { [weak self] _ in
let x = Int.random(in: 0...275)
let y = Int.random(in: 210...565)
self?.randomView.center = CGPoint(x: x, y: y)
}
}
无论哪种方式,当你想停止它时(包括在 deinit
实现中),请调用:
timer?.invalidate()
现在,如果您想制作动画,您可以使用非零持续时间。
func moveToRandomLocation() {
let x = Int.random(in: 0...275)
let y = Int.random(in: 210...565)
UIView.animate(withDuration: 0.5, delay: 0, options: .curveLinear) {
self.randomView.center = CGPoint(x: x, y: y)
} completion: { [weak self] _ in
self?.moveToRandomLocation()
}
}
这是我的代码,用于让我的图像在被点击时随机移动(使用手势识别器)。
但我希望这种情况不断自动发生,它自己不停地移动。
let x = Int.random(in: 0...275)
let y = Int.random(in: 210...565)
UIView.animate(withDuration: 0, delay: 0, options: .curveLinear, animations: {
self.randomView.center.y = CGFloat(y)
self.randomView.center.x = CGFloat(x)
}, completion: nil)
如果需要,我可以分享 ViewController 文件中的完整代码。
在回答您的问题时,您可以递归调用该方法,但有延迟。
话虽这么说,但您似乎一点也不生气。如果你只是想将它移动到不同的位置,你可以这样做:
weak var timer: Timer?
func moveToRandomLocation() {
let x = Int.random(in: 0...275)
let y = Int.random(in: 210...565)
randomView.center = CGPoint(x: x, y: y)
timer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: false) { [weak self] _ in
self?.moveToRandomLocation()
}
}
它移动了,半秒后,它自己调用了。而 [weak self]
捕获列表避免了强引用循环。我使用 Timer
计时器 invalidate
那个计时器你应该停止它。
或者,只需使用重复的 Timer
:
weak var timer: Timer?
func startMovingToRandomLocations() {
timer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true) { [weak self] _ in
let x = Int.random(in: 0...275)
let y = Int.random(in: 210...565)
self?.randomView.center = CGPoint(x: x, y: y)
}
}
无论哪种方式,当你想停止它时(包括在 deinit
实现中),请调用:
timer?.invalidate()
现在,如果您想制作动画,您可以使用非零持续时间。
func moveToRandomLocation() {
let x = Int.random(in: 0...275)
let y = Int.random(in: 210...565)
UIView.animate(withDuration: 0.5, delay: 0, options: .curveLinear) {
self.randomView.center = CGPoint(x: x, y: y)
} completion: { [weak self] _ in
self?.moveToRandomLocation()
}
}