swift 3:如何添加 UISlider?

Posted

技术标签:

【中文标题】swift 3:如何添加 UISlider?【英文标题】:swift 3: How to add UISlider? 【发布时间】:2017-03-13 10:44:18 【问题描述】:

我有ViewControllerAVAudioPlayer。现在我有了这个代码

import UIKit
import AVFoundation

var audioPlayer = AVAudioPlayer()

class ViewController: UIViewController 

@IBOutlet weak var slider: UISlider!
@IBOutlet weak var playButton: UIButton!
var index = 0
var timer: Timer?

override func viewDidLoad() 
    super.viewDidLoad()

    if index == 0

       let url = Bundle.main.url(forResource: "1", withExtension: "mp3")!

        do 
            audioPlayer = try AVAudioPlayer(contentsOf: url)
            audioPlayer.prepareToPlay()
            //audioPlayer.play()
            //play(sender:AnyObject.self as AnyObject)

         catch let error 
            print(error.localizedDescription)
        
    


@IBAction func slide(_ slider: UISlider) 
    audioPlayer.currentTime = TimeInterval(slider.value)


@IBAction func play(sender: AnyObject) 
    if !audioPlayer.isPlaying
        audioPlayer.play()
        // **** The line below is the new line ****
        timer = Timer(timeInterval: 1.0, target: self, selector: #selector(self.updateSlider), userInfo: nil, repeats: true)
        RunLoop.main.add(timer!, forMode: .commonModes)
     else 
        audioPlayer.pause()
        playButton.setImage(UIImage(named: "pause.png"), for: UIControlState.normal)
        timer?.invalidate()
    


func updateSlider(_ timer: Timer) 
    slider.value = Float(audioPlayer.currentTime)


override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()


我想添加 UISlider 以更改通过音频文件的擦洗。怎么做?

【问题讨论】:

你想改变音量还是浏览音频文件? @0x6368 我想通过音频文件更改scrub 【参考方案1】:

首先,您必须从滑块添加一个新的 IBAction,以确保您的类在滑块值更改时得到通知(在此处查找“响应用户交互”:https://developer.apple.com/reference/uikit/uislider#2557863)

在此事件处理程序中,您必须设置音频当前时间

@IBAction func slide(_ slider: UISlider) 
    audioPlayer.currentTime = TimeInterval(slider.value)

为确保滑块根据当前时间更新其值,您必须在启动播放器时添加一个计时器,该计时器调用自定义方法来更新滑块值。

@IBAction func play(sender: AnyObject) 
    if !audioPlayer.isPlaying
        audioPlayer.play()
        // **** The line below is the new line ****
        timer = Timer(timeInterval: 1.0, target: self, selector: #selector(self.updateSlider), userInfo: nil, repeats: true)
        RunLoop.main.add(timer, forMode: .commonModes)
     else 
        audioPlayer.pause()
        playButton.setImage(UIImage(named: "pause.png"), for: UIControlState.normal)
        timer.invalidate()
    

之后你必须创建更新滑块值的方法

func updateSlider(_ timer: Timer) 
    slider.value = Float(audioPlayer.currentTime)

然后你必须设置滑块的最大值

override func viewDidLoad() 
    super.viewDidLoad()

    if index == 0

       let url = Bundle.main.url(forResource: "1", withExtension: "mp3")!

        do 
            audioPlayer = try AVAudioPlayer(contentsOf: url)
            audioPlayer.prepareToPlay()
            // **** These two lines below are new ****
            slider.maximumValue = Float(audioPlayer.duration)
            slider.value = 0.0
         catch let error 
            print(error.localizedDescription)
        
    

最后你必须在你的 IBOutlets 下创建一个属性来保存计时器

var timer: Timer?

【讨论】:

请注意可能的保留周期,重复timer 保留self,而self 似乎保留了timerinvalidate() 应该会中断循环,但在复制音频时离开屏幕可能需要进行一些清理。 这是工作。但是当我擦洗我的滑块时冻结了。如何解决? 编辑:我已经更新了0x6368 的答案,将timer 包含在运行循环常用模式中,以修复滚动时滑块的冻结问题。 我有问题Class ‘ViewController’ has no initializers如何解决? 我认为您应该添加一个“?”给定时器:var timer: Timer?否则不允许为nil

以上是关于swift 3:如何添加 UISlider?的主要内容,如果未能解决你的问题,请参考以下文章

每次移动 UISlider 时删除注释 - mapView, Swift

在swift 3中检测uislider拇指拖动的方向

iOS Swift - UISlider - 添加第二个轨迹栏

如何在 Swift 中自定义 UISlider 值

如何通过 swift 3 的 snapkit 向任何 UI 添加动画?

Swift 检测 UISlider 图像点击