[英]Change UIImageView.image with delay
Okay, so I'm trying to create a "slideshow" of sorts by creating a class that would store an array of UIImages
, and have a function that would choose a random index from the array and then assign the associate image to the image view in ViewController.h
好的,所以我试图通过创建一个类来创建一个“幻灯片显示”,该类将存储
UIImages
数组,并具有一个可以从数组中选择随机索引,然后将关联图像分配给图像视图的函数在ViewController.h
import UIKit
import AVFoundation
class ViewController: UIViewController {
var audioPlayer = AVAudioPlayer()
var audioPath = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("1-08 Patient Love", ofType: "mp3")!)
var playPauseBtn = UIBarButtonItem()
var musicPaused: Bool = false
@IBOutlet var toolbar: UIToolbar!
@IBOutlet var bg1: UIImageView!
@IBOutlet var bg2: UIImageView!
@IBOutlet var bg3: UIImageView!
@IBOutlet var bg4: UIImageView!
@IBOutlet var bg5: UIImageView!
@IBOutlet var bg6: UIImageView!
@IBOutlet var bg7: UIImageView!
@IBOutlet var bg8: UIImageView!
@IBOutlet var bg9: UIImageView!
@IBOutlet var bg10: UIImageView!
@IBOutlet var bg11: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
do{
audioPlayer = try AVAudioPlayer(contentsOfURL: audioPath)}
catch {
print("Audio file not found.")
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func playPause(sender: UIBarButtonItem){
var items = toolbar.items!
if musicPaused == false {
playPauseBtn = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Pause, target: self, action: "playPause:")
items[0] = playPauseBtn
toolbar.setItems(items, animated: true)
audioPlayer.play()
musicPaused = true
}else{
var items = toolbar.items!
playPauseBtn = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Play, target: self, action: "playPause:")
items [0] = playPauseBtn
toolbar.setItems(items, animated: true)
audioPlayer.pause()
musicPaused = false
}
}
@IBAction func stopButton(sender: AnyObject) {
var items = toolbar.items!
audioPlayer.stop()
audioPlayer.currentTime = 0
playPauseBtn = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Play, target: self, action: "playPause:")
items[0] = playPauseBtn
toolbar.setItems(items, animated: true)
musicPaused = false
}
}
This is my view controller.swift file. 这是我的view controller.swift文件。 I don't have a reference yet to the function I'm trying to write in a slideshow.swift file here
我还没有对要在此处的slideshow.swift文件中编写的功能的引用
import UIKit
var imageArray: [UIImage] = [
UIImage(named: "dec11.jpg")!,
UIImage(named: "dec18.jpg")!,
UIImage(named: "dec19.jpg")!,
UIImage(named: "dec19-2.jpg")!,
UIImage(named: "dec24.jpg")!,
UIImage(named: "dec25.jpg")!,
UIImage(named: "dec30.jpg")!,
UIImage(named: "jan1.jpg")!,
UIImage(named: "jan20.jpg")!,
UIImage(named: "jan24.jpg")!,
UIImage(named: "jan30.jpg")!
]
The slideshow class is 幻灯片放映课程为
class slideshow: NSObject {
func changeImage() -> UIImage{
//wait 2 secs
let seconds = 2.0
let delay = seconds * Double(NSEC_PER_SEC) // nanoseconds per seconds
let dispatchTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
dispatch_after(dispatchTime, dispatch_get_main_queue(), {
//here code perfomed with delay
//generate random number
let randomIndex = Int(arc4random_uniform(11))
var imageAtIndex = imageArray[randomIndex]
return imageAtIndex
})
}
}
Would it be easier to just write this all in view controller? 只在视图控制器中编写所有内容会更容易吗? I changed the function declaration as per the suggestion of other users, but I'm still getting the same error.
我根据其他用户的建议更改了函数声明,但仍然遇到相同的错误。
You can't have two declarations of the variable image
. 您不能有两个变量
image
声明。 You have one that is passed into the function: 您有一个传递给函数的函数:
@IBAction func changeImage (image: UIImage){
And another that is part of your delayed action: 另一个是您延迟行动的一部分:
//return image at index
var image = imageAtIndex
You don't want to return the image, you want to set the image property of the UIImageView
to the image from the array, assuming your array contains UIImage
. 您不想返回图像,而是想将
UIImageView
的image属性设置为数组中的图像,假设您的数组包含UIImage
。
So change your function decalaration to be 因此,将您的功能声明更改为
func changeImage (imageViewToChange: UIImageView){
Then change the dispatch_after
code to be 然后将
dispatch_after
代码更改为
dispatch_after(dispatchTime, dispatch_get_main_queue(), {
//here code performed after delay
//generate random number
let randomIndex = Int(arc4random_uniform(11))
//return image at index
imageViewToChange.image = imageArray[randomIndex]
})
The following code is untested but you should be able to do something like the following. 以下代码未经测试,但是您应该可以执行以下操作。 The slideshow class contains the list of possible images with a start and stop method.
slideshow类包含带有start和stop方法的可能图像的列表。 The animate method calls recursively so you don't have to call it from your vc every time.
animate方法以递归方式调用,因此您不必每次都从vc调用它。
import UIKit
import AVFoundation
class ViewController: UIViewController {
var audioPlayer = AVAudioPlayer()
var audioPath = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("1-08 Patient Love", ofType: "mp3")!)
var playPauseBtn = UIBarButtonItem()
var musicPaused: Bool = false
@IBOutlet var toolbar: UIToolbar!
@IBOutlet var bg: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
do{
audioPlayer = try AVAudioPlayer(contentsOfURL: audioPath)}
catch {
print("Audio file not found.")
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func playPause(sender: UIBarButtonItem){
var items = toolbar.items!
if musicPaused == false {
playPauseBtn = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Pause, target: self, action: "playPause:")
items[0] = playPauseBtn
toolbar.setItems(items, animated: true)
audioPlayer.play()
musicPaused = true
slideshow.startSlideshow(bg)
}else{
var items = toolbar.items!
playPauseBtn = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Play, target: self, action: "playPause:")
items [0] = playPauseBtn
toolbar.setItems(items, animated: true)
audioPlayer.pause()
slideshow.stopSlideshow()
musicPaused = false
}
}
@IBAction func stopButton(sender: AnyObject) {
var items = toolbar.items!
audioPlayer.stop()
audioPlayer.currentTime = 0
playPauseBtn = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Play, target: self, action: "playPause:")
items[0] = playPauseBtn
toolbar.setItems(items, animated: true)
musicPaused = false
slideshow.stopSlideshow()
}
}
class slideshow: NSObject {
var imageArray: [UIImage] = [
UIImage(named: "dec11.jpg")!,
UIImage(named: "dec18.jpg")!,
UIImage(named: "dec19.jpg")!,
UIImage(named: "dec19-2.jpg")!,
UIImage(named: "dec24.jpg")!,
UIImage(named: "dec25.jpg")!,
UIImage(named: "dec30.jpg")!,
UIImage(named: "jan1.jpg")!,
UIImage(named: "jan20.jpg")!,
UIImage(named: "jan24.jpg")!,
UIImage(named: "jan30.jpg")!
]
var shouldAnimate: boolean?
func startSlideshow(imageView: UIImageView) {
shouldAnimate = true
self.animate()
}
func stopSlideshow() {
shouldAnimate = false
}
func animate() {
//wait 2 secs
let seconds = 2.0
let delay = seconds * Double(NSEC_PER_SEC) // nanoseconds per seconds
let dispatchTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
dispatch_after(dispatchTime, dispatch_get_main_queue(), {
//here code perfomed with delay
//generate random number
let randomIndex = Int(arc4random_uniform(11))
var imageAtIndex = imageArray[randomIndex]
imageView.image = imageAtIndex
if (shouldAnimate) {
self.animate()
}
})
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.