我具有正常的UIImage
和图像的list
。我的目标是每隔几秒钟,图像就会自动变化,并且循环不断地通过我的imageList
。
这是我的清单:
let images: [UIImage] = [
UIImage(named: "avocadoImage")!,
UIImage(named: "beerImage")!,
UIImage(named: "bikeImage")!,
UIImage(named: "christmasImage")!,
UIImage(named: "dressImage")!,
UIImage(named: "giftImage")!,
UIImage(named: "goalImage")!,
UIImage(named: "rollerImage")!,
UIImage(named: "shirtImage")!,
UIImage(named: "shoeImage")!,
UIImage(named: "travelImage")!,
]
我尝试过:
NSTimer(timeInterval: 0.5, target: self, selector: "ChangeImage", userInfo: nil, repeats: true)
但是我不知道如何反复遍历数组。
创建以下实例属性:
private let imageView = UIImageView()
private var imageTimer: Timer?
private let images: [UIImage] = [
UIImage(named: "avocadoImage")!,
UIImage(named: "beerImage")!,
UIImage(named: "bikeImage")!,
UIImage(named: "christmasImage")!,
UIImage(named: "dressImage")!,
UIImage(named: "giftImage")!,
UIImage(named: "goalImage")!,
UIImage(named: "rollerImage")!,
UIImage(named: "shirtImage")!,
UIImage(named: "shoeImage")!,
UIImage(named: "travelImage")!,
]
然后启动计时器,并将其添加到视图控制器生命周期中某个地方的运行循环中(也许是viewDidLoad
:]
private func startImageTimer() {
// instantiate timer
imageTimer = Timer(fire: Date(), interval: 5, repeats: true) { (timer) in
imageView.image = images.randomElement()
}
// add to run loop
RunLoop.main.add(imageTimer!, forMode: .common)
}
然后,您需要观察应用程序进入和退出后台的时间,以便您可以在应用程序不运行时终止计时器。像往常一样,罗布·纳皮尔(Rob Napier)很好地解释了为什么这是本文中的好主意(Is NSTimer expected to fire when app is backgrounded?)。
// add these observers, perhaps in viewDidLoad
NotificationCenter.default.addObserver(self, selector: #selector(appDidEnterBackgroundHandler), name: UIApplication.didEnterBackgroundNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(appWillEnterForegroundHandler), name: UIApplication.willEnterForegroundNotification, object: nil)
@objc private func appDidEnterBackgroundHandler() {
if imageTimer != nil {
imageTimer!.invalidate()
imageTimer = nil
}
}
@objc private func appWillEnterForegroundHandler() {
startImageTimer()
}
并且,显然,images
不必是实例属性(但是其他两个都需要)。您可以使用startImageTimer
方法在本地存储图像。