Как вызвать событие UIButton при перетаскивании пальца с 1 кнопки на следующую - PullRequest
0 голосов
/ 03 сентября 2018

Это простое приложение ксилофон из учебника, которому я следую. Если мы нажимаем на каждую кнопку, воспроизводится новая нота. Работает нормально. Но когда я хочу провести от одной кнопки к другой, звука нет.

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

А вот так выглядит приложение. enter image description here

Я новичок, поэтому мои знания очень ограничены. Я пытался найти решения, но нет ни одного, который объясняет, как решить мою проблему с помощью swift 4. Если существует какое-то старое решение, то я не могу их понять. Я пытался использовать приведенные ниже события, но они, похоже, не работают. enter image description here

1 Ответ

0 голосов
/ 03 сентября 2018

Вы подключили событие Touch Up Inside, поэтому нажатие работает (ваша функция notePressed). Если вы хотите, чтобы ваш код также работал со смахиванием, попробуйте подключить события Touch Drag Exit или Touch Drag Enter.

На последнем экране выберите это событие и перетащите его на

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

Имена событий самоописываются, но здесь вы также можете найти объяснение

// EDIT: Хорошо, я, наверное, сначала не понял тебя. Я думаю, что ваша проблема похожа на ЭТО .

Идея:

  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)
            }
        }
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...