簡體   English   中英

延遲更改UIImageView.image

[英]Change UIImageView.image with delay

好的,所以我試圖通過創建一個類來創建一個“幻燈片顯示”,該類將存儲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
}
}

這是我的view controller.swift文件。 我還沒有對要在此處的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")!
]

幻燈片放映課程為

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
    })
}
}

只在視圖控制器中編寫所有內容會更容易嗎? 我根據其他用戶的建議更改了函數聲明,但仍然遇到相同的錯誤。

您不能有兩個變量image聲明。 您有一個傳遞給函數的函數:

@IBAction func changeImage (image: UIImage){

另一個是您延遲行動的一部分:

    //return image at index
    var image = imageAtIndex

您不想返回圖像,而是想將UIImageView的image屬性設置為數組中的圖像,假設您的數組包含UIImage

因此,將您的功能聲明更改為

func changeImage (imageViewToChange: UIImageView){

然后將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]
})

以下代碼未經測試,但是您應該可以執行以下操作。 slideshow類包含帶有start和stop方法的可能圖像的列表。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM