如何让图像在 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()
    }
}