【问题标题】:use a slider while pressing button swift快速按下按钮时使用滑块
【发布时间】:2017-12-23 23:15:58
【问题描述】:

将 Xcode 8、Swift 3 和 Interface Builder 与 Storyboard 和一个非常基本的视图控制器结合使用,只有一个按钮(播放)和一个滑块(音量)。

我正在尝试在按下按钮的同时使用我的 NSSlider。例如,我需要能够在缓慢降低音量的同时按住“播放”。相反,一次只能使用一个按钮。所以,只要我用返回键按“播放”,我就不能调节音量,反之亦然。

在本例中,播放按钮由“返回”键触发。

这是 ViewController.swift 中的代码。这只是我为研究问题而快速创建的一个示例应用程序。

我是否缺少 NSSLider 上的 Interface Builder 设置,或者我可以在我的代码中做一些事情来实现我想要做的事情吗?

import Cocoa
import AVFoundation

class ViewController: NSViewController {

    var audioPlayer = AVAudioPlayer()
    var sliderValue: Float = 0

    @IBOutlet weak var volumeSliderOutlet: NSSlider!

    override func viewDidLoad() {
        super.viewDidLoad()
        do{
            audioPlayer =  try AVAudioPlayer(contentsOf: URL.init(fileURLWithPath: Bundle.main.path(forResource: "bell ding", ofType: "wav")!))
        }
        catch {
            print(error)
        }
        audioPlayer.prepareToPlay()


        // Do any additional setup after loading the view.
    }

    @IBAction func playButtonAction(_ sender: NSButton) {
        if audioPlayer.isPlaying {
            audioPlayer.currentTime = 0.0
            audioPlayer.play()
        } else {
        audioPlayer.prepareToPlay()
        audioPlayer.play()
        }
    }

    @IBAction func volumeSliderAction(_ sender: NSSlider) {
        if audioPlayer.isPlaying {
            sliderValue = self.volumeSliderOutlet.floatValue
            audioPlayer.volume = sliderValue
        } else {
            return
        }
    }

    override var representedObject: Any? {
        didSet {
        // Update the view, if already loaded.
        }
    }


}

根据@inspector_60 的建议,我也试过这个,但它也不起作用。继续按“返回”按钮的快捷键时仍然无法处理滑块。

override func keyDown(with event: NSEvent) {
        if (event.keyCode == 36) {
            self.playButtonAction(nil)
        }
        else {
            return
        }
    }

    func playButtonAction(_ sender: NSButton?) {
        if audioPlayer.isPlaying {
            audioPlayer.currentTime = 0.0
            audioPlayer.play()
        } else {
            audioPlayer.prepareToPlay()
            audioPlayer.play()
        }
    }

【问题讨论】:

  • 你不能在 VolumeSliderAction 组合上使用 Play 动作吗?
  • 我不确定你的意思。我需要能够同时或分别使用这两个动作。我想通过按“返回”来一遍又一遍地播放声音,同时(用我的另一只手)使用鼠标上下拖动滑块,从而改变音量。到目前为止,我只能做一个或另一个。你能举例说明你的意思吗?

标签: swift xcode macos interface-builder


【解决方案1】:

IBAction 是 UI 事件,因此不适合同时单击多个(您只有一个鼠标指针)。使用handling key events 来处理同时操作的键盘事件。

您还需要实现鼠标事件,这些链接应该会有所帮助:

  1. 关于鼠标事件的 Apple 文档,特别是 Filtering Out Key Events During Mouse-Tracking Operations
  2. This stack overflow answer 关于如何实现这种方法
  3. 这个post 将为您提供更多信息和示例 - Ron 的答案链接到与您的问题没有太大不同的问题

【讨论】:

  • 谢谢。我尝试调整代码,以便不使用内置在“Key Equivalent”中的 IB,而是使用 keyDown 调用函数来播放声音。我仍然遇到同样的问题。只要我用鼠标控制滑块,就不能用按键触发播放功能。
  • 我一直在尝试使用您的建议,但似乎无法成功。我一直在查看您分享的所有链接,并试图从 Objective-C 转换为 Swift,但没有成功。这种事情只发生在 Python 中(在我创建的同一应用程序的另一个版本中)。你有机会给我一个 Swift 的例子吗?我只是希望在调整音量时能够继续按等效键(返回)。
猜你喜欢
  • 2017-02-06
  • 2016-09-02
  • 2018-07-30
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多