【问题标题】:How to trigger UIButton event when finger is dragged from 1 button to the next当手指从一个按钮拖动到下一个按钮时如何触发 UIButton 事件
【发布时间】:2018-09-03 07:19:04
【问题描述】:

这是一个简单的木琴应用程序,来自我正在关注的教程。 如果我们按下每个按钮,就会播放一个新音符。它工作正常。 但是当我想从一个按钮滑动到另一个按钮时,没有声音。

完整项目的 Github 链接: https://github.com/jaineelesh/Xylophone

我也尝试过使用 Touch Drag Enter/Exit/Inside/Outside,但似乎没有什么对我有用。

请帮忙。

ViewController.swift 文件

import UIKit
import AVFoundation

class ViewController: UIViewController{

var player: AVAudioPlayer?

override func viewDidLoad() {
    super.viewDidLoad()
}

@IBAction func noteOnDrag(_ sender: UIButton) {
    // selecting the correct note based on the tag
    //playSound(tag: sender.tag)
    print("enter")
}

@IBAction func noteOnDragExit(_ sender: UIButton) {
    print("Exit")
}

@IBAction func notePressed(_ sender: UIButton) {
    // selecting the correct note based on the tag
    //playSound(tag: sender.tag)
}

func playSound(tag: Int) {
    let note = "note" + String(tag)
    guard let url = Bundle.main.url(forResource: note, withExtension: "wav") else { return }

    do {
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
        try AVAudioSession.sharedInstance().setActive(true)

        player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.wav.rawValue)

        guard let player = player else { return }

        player.play()
    } catch let error {
        print(error.localizedDescription)
    }
}

这就是应用程序的外观。

我是初学者,所以我的知识非常有限。我试图找到解决方案,但没有一个可以解释如何使用 swift 4 解决我的问题。如果存在一些旧的解决方案,那么我无法理解它们。 我尝试使用以下事件,但它们似乎不起作用。

【问题讨论】:

  • 使用 UIControls 而不是 UIButtons 可能会更好。设置它们可能有点困难,因为它会通过情节提要,但是制作一个自定义 UIControl 类并将它们放置在您的视图控制器上可能是一个更干净的解决方案。他们有一个draggedInto 方法会触发,你可以将它传回你的视图控制器,以便播放你想要播放的声音。
  • 从音乐的角度来看,您正在寻找并描述的功能称为“滑音”(从一个按钮/键滑动或拖动到下一个。可能值得查找“ How to Glissando” in code/programming/swift 等。我还尝试添加一些功能:1)playChords(例如,四个手指,四个水龙头,四个音符一次。四个 mediaPlayer 实例(创建和发布,重新使用四个媒体播放器实例)2)noteNames 切换开关(例如 IB 布尔开关 true/false for button.text)如果您对此有任何运气或想法,请告诉我。最良好的祝愿,托尼厄巴

标签: ios swift uibutton


【解决方案1】:

您已连接事件Touch Up Inside,这就是为什么按下有效(您的notePressed 功能)。如果您希望您的代码也适用于滑动,请尝试连接 Touch Drag ExitTouch Drag Enter 事件。

在最后一个屏幕上选择该事件并将其拖到

@IBAction func notePressed(_ sender: UIButton) {
    // selecting the correct note based on the tag
    //playSound(tag: sender.tag)
}

事件名称是自描述的,但here你也可以找到解释

//编辑: 好吧,我一开始可能没听懂你的意思。 我认为您的问题类似于THIS

想法:

  1. 制作一个包含所有按钮的插座集合。

    @IBOutlet var buttons: [UIButton]!
    
  2. 使用touchesMoved方法(示例):

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesMoved(touches, with: event)
        guard let touch = event?.allTouches?.first else {return}
        let touchLocation = touch.location(in: self.view)
        buttons.forEach { (button) in
            if button.frame.contains(touchLocation) {
                print(button.tag)
            }
        }
    }
    

【讨论】:

  • 已经通过拖动进入/退出动作事件做到了这一点。但什么也没发生。我使用了 print() 语句,但是当我从 1 个按钮滑动到其他按钮时它永远不会被调用。
  • Hi 有帮助,但非常轻微,并没有做我正在寻找的东西。我在您的上述解决方案中面临的几个问题: 1. 它仅在我从按钮外部滑动到按钮时才有效。如果我从 1 个按钮滑动到另一个按钮,则不起作用。 2. 即使我在按钮内移动,音符也会继续播放,但这与木琴按键的想法相反,因为如果按下一个键,在我松开按钮之前应该有 1 个声音。但是在这里,当我什至在按钮内移动时,它会发出新的声音。
猜你喜欢
  • 2013-08-23
  • 2011-11-23
  • 2020-08-01
  • 2012-11-10
  • 2013-06-09
  • 1970-01-01
  • 2022-01-09
  • 2016-01-11
  • 2014-04-24
相关资源
最近更新 更多