[실로폰앱] Linking Multiple Buttons to the Same IBAction

Lena·2021년 12월 24일
0

iOS앱개발 입문기

목록 보기
9/17

C부터 B까지 연주할 수 있는 실로폰 앱을 만들어보자.
실로폰을 연주해야 하므로 해당 건반을 누르면 소리가 나도록 해야한다. 이를 위해 AVFoundation 을 사용한다.

import UIKit
// UIKit 프레임워크를 사용하기 위해 필요한 기본 파일들을 읽어들이는 부분
import AVFoundation

class ViewController: UIViewController {
// UIviewController 클래스를 상속받아 ViewController라는 이름의 새로운 클래스를 정의
    var player:AVAudioPlayer?

    override func viewDidLoad() {
    // 오버라이딩(swift에서는 오버라이딩 시 override 키워드를 붙여주어야 한다. 재정의했음에도 키워드 붙이지 않거나, 재정의하지 않았는데 키워드를 추가하면 오류 발생!! -> 새로운 기능이나 추가 기능을 구현할 때만 사용하면 된다.
        super.viewDidLoad()
    }


    
    @IBAction func keyPressed(_ sender: UIButton) {
        playSound()
     // 실로폰의 각 키를 눌렀을 때 소리를 재생한다  
     // 해당 코드는 기능이 필요할 때마다 찾아서 사용하면 된다
    }
    
    func playSound(){ // playSoud 함수 구현 
        guard let url = Bundle.main.url(forResource: "C", withExtension: "wav") // C 소리를 찾는다
                
        else { return }
        
        do{
            try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default)
            // setCategory : sets the current audio session category
            // playback : not a background music. main sound
            // silent mode 에서도 소리가 나게 하고싶다
            
            try AVAudioSession.sharedInstance().setActive(true)
            
            player = try AVAudioPlayer(contentsOf: url, fileTypeHint:
                                        AVFileType.mp3.rawValue)
            
            guard let player = player else { return }
            
            player.play() // 실제로 연주한다
            
        } catch let error {
            print(error.localizedDescription)
        }
    }

IBAction

Linking

storyboard에서 키를 누르면 소리를 재생하는 함수를 실행하도록 연결해준다.

성공적으로 연결이 되면 연결 이후 해당 라인넘버에 마우스를 올려두었을 때 다음과 같이 표기된다.

현재는 같은 함수에 연결했기 때문에 모든 버튼을 눌렀을 경우 항상 C음 소리가 난다.
이제 각 버튼에서 다른 음이 나도록 해보자.

sender 통해서 객체 속성에 접근하기

Q. 버튼을 눌렀을 때 각 키의 이름을 출력하려면 어떻게 해야 할까?

@IBAction func keyPressed(_ sender: UIButton) {

	print(sender.currentTitle)
        
	playSound()
}
  • attribute inspector에 있는 값은 어떤 값이든 sender.~를 통해 접근할 수 있다.

Function 이용하여 하나의 함수로 모든 키를 연주하기

@IBAction func keyPressed(_ sender: UIButton) {
        
        playSound(soundName: sender.currentTitle!)
        // ! : 모든 키가 title을 가지고 있다고 이미 확인했다!
        // 키를 누르게 되면 그 키에 해당하는 title 찾는다. 
}
    
    func playSound(soundName: String){
        guard let url = Bundle.main.url(forResource: soundName, withExtension: "wav")
	//  currentTitle의 soundName에 해당하는 소리를 찾아 연주한다

완성된 결과물

https://drive.google.com/file/d/19xAdI6suS-Dgd5Xgsrs3BH1bijOWYQoI/view?usp=sharing

cf. 투명도 및 지속시간 설정하기

@IBAction func keyPressed(_ sender: UIButton) {
        
	playSound(soundName: sender.currentTitle!)
    // ! : 모든 키가 title을 가지고 있다고 이미 확인했다!
    
    sender.alpha = 0.5
    // 누르는 버튼의 투명도를 감소시킨다.
        
	// 누른 이 후 0.2초동안 유지한다
	DispatchQueue.main.asyncAfter(deadline: .now() + 0.2){
	sender.alpha = 1.0
	// 0.2초가 지나면 투명도를 원래대로! 
        }

0개의 댓글