2017-07-18 5 views
0

Xcode 8、Swift 3、Interface Builderをストーリーボードで使用し、ボタン(再生)とスライダー(ボリューム)を備えた非常に基本的なビューコントローラー。ボタンスウィフトを押しながらスライダーを使用

ボタンを同時に押しながらNSSliderを使用しようとしています。例えば、音量をゆっくり下げながら「再生」を押し続けることができるようにする必要があります。代わりに、一度に使用できるボタンは1つだけです。だから、リターンキーを使って "Play"を押している限り、ボリュームを調整することはできず、その逆もありません。

この例では、再生ボタンは「戻る」キーによってトリガーされます。

ここに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() 
     } 
    } 
+0

Play actioは使用できませんVolumeSliderActionのnが結合されていますか? – ppinho

+0

私はあなたが何を意味するか分かりません。私は、両方のアクションを同時に、または別々に使用できる必要があります。私は、マウスを使ってスライダを上下にドラッグして音量を変更しながら(私の他の手で)「戻る」を押すことによって、何度も音を鳴らしたいと思っています。現時点では、私はどちらか一方しか行うことができません。あなたは私があなたが意味するものの例を教えてもらえますか? – RickshawBoy

答えて

0

IBActionは複数の同時クリック(マウスポインタが1つしかない)には適していないUIイベントです。同時に実行するキーボードイベントを処理するには、handling key eventsを使用してください。あなたはまた、マウスイベントを実装する必要が

は、これらのリンクは役立つはず:

  1. をアップルのドキュメント
  2. このアプローチを実装する方法のマウスイベント、具体的にFiltering Out Key Events During Mouse-Tracking Operations
  3. This stack overflow answerについてこのpost与えることあなたの詳細と例 - Ronさんの答えは、あなたと違う質問にリンクしています
+0

ありがとうございます。私はコードを調整して、 "Key Equivalent"でビルドされたIBを使用する代わりに、keyDownを使ってサウンドを再生する関数を呼び出すようにしました。私はまだ同じ問題で終わります。私がマウスでスライダをコントロールしている限り、キーで再生機能を起動することはできません。 – RickshawBoy

+0

私はあなたのアドバイスを使用しようとしてきましたが、私はそれを動作させるように見えません。共有したすべてのリンクを見て、Objective-CからSwiftに翻訳しようとしています。このちょっとしたことはちょうどPythonで(私が作成した同じアプリの別のバージョンで)起こります。あなたは私にスウィフトの例を与えることができますか?私は、音の音量を調節している間、キーの等価物(リターン)を押し続けたいだけです。 – RickshawBoy

関連する問題