swift - 快速按下按钮时使用 slider

标签 swift xcode macos interface-builder

使用 Xcode 8、Swift 3 和 Interface Builder 以及 Storyboards 和一个非常基本的 View Controller ,仅包含一个按钮(播放)和一个 slider (音量)。

我尝试在按下按钮的同时使用 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的建议,我也尝试过这个,但它也不起作用。继续按“返回”按钮的快捷键时仍然无法处理 slider 。

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

最佳答案

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

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

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

关于swift - 快速按下按钮时使用 slider ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45177755/

相关文章:

git - Homebrew 更新失败 : fatal: protocol error: bad pack header on git fetch

ios - UIImagePickerController 从 UICollectionViewCell 中的 UIImageView 呈现

swift - 使用 NSFetchedResultsController 如何以编程方式设置要显示的 5 个部分以及过滤它们以获取适当的行

c - 启动时是否将整个静态程序加载到内存中?

ios - 如何从字符串中获取日期、时间和金额

ios - 在我的 iPhone 上运行 Xcode 项目

macos - NSTextField 无法在 NSTabViewController 中渲染新泰略

ios - Swift 中的大型 Core Data 批量插入导致内存泄漏

ios - 哪些约束相互冲突?

ios - 如何在 API .js 上连接我的 iOS 应用程序