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 移出屏幕,但我没有更改ViewControllerdelete 子视图。那么当它移出屏幕时它真的会停止吗? UIApplication.didEnterBackgroundNotification 会在应用程序本身进入后台时通知您(即用户按下 iPhone 上的主页按钮以离开您的应用程序但没有终止应用程序)。然后当应用程序回到他们的屏幕时,另一个通知会通知你。您应该在应用程序进入和退出后台时启动和停止计时器。但是,在您的情况下,您也可以选择在视图控制器进入和退出视图时启动和停止计时器。我没有将其纳入我的答案中。 如果这个视图控制器没有永久的生命周期,那么我会停止并 nil 视图控制器的 deinit ... 中的计时器,这样它就不会在视图控制器时停留在运行循环中不再活着。 好吧,我明白了。在我的情况下,我有 buttonView 出现。但是我在这里遇到了一个问题,因为计时器仅在我让View 第二次出现后才开始。 (如果我没有在 viewDidLoad 内实现 startImageTimer(),则会发生这种情况 计时器是在普通的UIView 内还是在UIViewController 内?

以上是关于Swift - 动态更改 UIImageView 的图像的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中检测 UIImageView 上的 UIImageView 更改或 KVO 炒锅

无法更改 UITableViewCell 内 UIImageView 的宽度和高度 - swift

图像文件更改后在 Swift 中刷新 UIImageView

swift UIImageView色调不会从xib更改

如何在 Swift 中使用 UISlider 更改 UIImageView 中的图像

我如何在 Swift iOS 中检测 UIImageView 中的更改图像