Swift - 动态更改 UIImageView 的图像
Posted
技术标签:
【中文标题】Swift - 动态更改 UIImageView 的图像【英文标题】:Swift - change image of UIImageView dynamically 【发布时间】:2019-12-02 16:42:50 【问题描述】:我有一个普通的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)
但我不知道如何一遍又一遍地循环遍历我的数组。
【问题讨论】:
倒数还是随机? 随机会很好:) 【参考方案1】:创建以下实例属性:
private let imageView = UIImageView()
private var imageTimer: Timer?
private let images = [
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()
imageTimer = Timer(fire: Date(), interval: 5, repeats: true) (timer) in
imageView.image = images.randomElement()
RunLoop.main.add(imageTimer!, forMode: .common)
然后,您需要观察应用何时进入和退出后台,以便切换计时器。添加这些观察者(可能是viewDidLoad
):
NotificationCenter.default.addObserver(self, selector: #selector(backgroundHandler), name: UIApplication.didEnterBackgroundNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(foregroundHandler), name: UIApplication.willEnterForegroundNotification, object: nil)
@objc private func backgroundHandler()
imageTimer?.invalidate()
imageTimer = nil
@objc private func foregroundHandler()
startImageTimer()
【讨论】:
您的答案运行良好,但我不太确定计时器是否真的停止了。didEnterBackground
是如何工作的?因为我只是用.transform
将我的View
移出屏幕,但我没有更改ViewController
或delete
子视图。那么当它移出屏幕时它真的会停止吗?
UIApplication.didEnterBackgroundNotification
会在应用程序本身进入后台时通知您(即用户按下 iPhone 上的主页按钮以离开您的应用程序但没有终止应用程序)。然后当应用程序回到他们的屏幕时,另一个通知会通知你。您应该在应用程序进入和退出后台时启动和停止计时器。但是,在您的情况下,您也可以选择在视图控制器进入和退出视图时启动和停止计时器。我没有将其纳入我的答案中。
如果这个视图控制器没有永久的生命周期,那么我会停止并 nil
视图控制器的 deinit ...
中的计时器,这样它就不会在视图控制器时停留在运行循环中不再活着。
好吧,我明白了。在我的情况下,我有 button
让 View
出现。但是我在这里遇到了一个问题,因为计时器仅在我让View
第二次出现后才开始。 (如果我没有在 viewDidLoad
内实现 startImageTimer()
,则会发生这种情况
计时器是在普通的UIView
内还是在UIViewController
内?以上是关于Swift - 动态更改 UIImageView 的图像的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 中检测 UIImageView 上的 UIImageView 更改或 KVO 炒锅
无法更改 UITableViewCell 内 UIImageView 的宽度和高度 - swift
图像文件更改后在 Swift 中刷新 UIImageView