음악재생 ) 애플리케이션 만들기

이하연·2021년 8월 15일
0

Boostcourse

목록 보기
3/20

1. 프로젝트에 이미지 추가하기

  • assets에 이미지, 음원파일 추가하기

    1. asset 폴더로 이동

      command + shift + o ( 빠른 파일 열기 실행 )

    2. appicon 삭제

    3. 마우스 오른쪽 - Import... - 압축 푼 assets 추가하기

2. 인터페이스 빌더로 화면 구성하기

  • 인터페이스 빌더는, 개발자가 자신의 아이디어를 실제 구조화 된 뷰로 구성하여 그들 간의 관계에 대한 일종의 로드맵이 될 수 있는 가능성을 제공하는 놀라운 환경입니다.
  • 단, 개발자에게 유용한 도구지만 다른 개발자와 코드 및 디자인을 공유해야하는 대규모 프로젝트에는 사용하지 않는 것이 좋습니다. 이유는 branch, commit을 merge할때 충돌이 발생할 수 있기 때문입니다.
  • 종류 : 디자인 시간, 컴파일 시간, 실행 시간

  • Storyboard - 인터페이스 빌더 화면 - button,label,slider 추가

  • Xcode Library창

    command + shift + L

  1. Button
    • 속성 - type - Custom button
    • 속성 - Image - play 이미지
    • 속성 - Selected - pause 이미지
    • 속성 - 타이틀 이름 - 필요없으면 지우기
  2. Label (레이블)
    • 몇 초가 지났는지 표현하기
  3. Slider
    • 음악이 얼마나 재생되었는지, 원하는 시간으로 이동하는 것을 표현

3,4. 인터페이스 빌더의 객체를 코드와 연결

  • IBOutlet 3가지 방법

    @IBOutlet weak var playPauseButton: UIButton!
    @IBOutlet weak var timeLabel: UILabel!
    @IBOutlet weak var progressSlider: UISlider!
    1. 코드로 먼저 IBOutlet을 생성한 후 인터페이스 빌더의 Outlet Inspector를 통해 연결
    2. 코드로 먼저 IBOutlet을 생성한 후 인터페이스 빌더에서 viewController 우클릭 후 팝업에서 연결
    3. 인터페이스 빌더에서 코드로 끌어당겨 연결
  • IBAction 3가지 방법

    @IBAction func touchPlayPause(_ sender: UIButton){
            print("----> Button success")
        }
    1. 코드로 먼저 IBAction을 생성한 후 인터페이스 빌더의 Outlet Inspector를 통해 연결

    2. 코드로 먼저 IBAction을 생성한 후 인터페이스 빌더에서 viewController 우클릭 후 팝업에서 연결

    3. 인터페이스 빌더에서 코드로 끌어당겨 연결

      → 모두 print 로그를 통해 액션이 제대로 동작하는지 확인

  • StoryBoard → Class 로 이동

    command + control + >

  • StoryBoard → Class 로 이동

    command + control + <

  • storyboard 상태에서 ViewController 열고싶을때

    option + 원하는Controller 선택


5. UIButton, UISlider, UILabel

UIButton

  • UIButton 클래스는, 사용자의 상호작용에 반응해 미리 지정된 코드를 실행시키는 컨트롤 요소

  • 버튼과 메서드 연결하는 방법

    1. addTarget(_: action:for:) 메서드 사용
    2. 인터페이스 빌더에서 연결 @IBAction
  • 버튼과 연결되는 메서드 3가지 형식

    func doSomething()
    func doSomething(sender: UIButton)
    func doSomething(sender: UIButton, forEvent event: UIEvent)
  • 버튼의 상태

    • default, highlighted, focused, selected, disabled
    • 버튼 상태는 위 5가지를 조합해서 사용 가능합니다.
  • 버튼 주요 메서드

    // 특정 상태의 버튼의 문자열 설정
    func setTitle(String?, for: UIControlState)
    
    // 특정 상태의 버튼의 문자열 반환
    func title(for: UIControlState) -> String?
    
    // 특정 상태의 버튼 이미지 설정
    func setImage(UIImage?, for: UIControlState)
    
    // 특정 상태의 버튼 이미지 반환
    func image(for: UIControlState) -> UIImage?
    
    // 특정 상태의 백그라운드 이미지 설정
    func setBackgroundImage(UIImage?, for: UIControlState)
    
    // 특정 상태의 백그라운드 이미지 반환
    func backgroundImage(for: UIControlState) -> UIImage?
    
    // 특정 상태의 문자열 색상 설정
    func setTitleColor(UIColor?, for: UIControlState)
    
    // 특정 상태의 attributed 문자열 설정
    func setAttributedTitle(NSAttributedString?, for: UIControlState)

UILabel

  • UILabel은 한 줄 또는 여러줄의 텍스트를 보여주는 뷰
  • 레이블 주요 프로퍼티
    • var text: String? : 레이블이 표시할 문자열 /
      • 문자열이 모두 동일한 속성(폰트, 색상, 기울임꼴 등)으로 표시됩니다.
      • text 프로퍼티에 값을 할당하면 attributedText 프로퍼티에도 똑같은 내용의 문자열이 할당됩니다.
    • var attributedText: NSAttributedString? : 레이블이 표시할 속성 문자열
      • NSAttributed 클래스를 사용한 속성 문자열 중 특정 부분의 속성을 변경할 수 있습니다. ([예] 일부 글자 색상 변경/일부 글자 폰트 변경)
      • attributedText 프로퍼티에 값을 할당하면 text 프로퍼티에도 똑같은 내용의 문자열이 할당됩니다.
    • var textColor: UIColor! : 문자 색상
    • var font: UIFont!: 문자 폰트
    • var textAlignment: NSTextAlignment: 문자열의 가로 정렬 방식
      • leftrightcenterjustifiednatural 중 하나를 선택할 수 있습니다.
    • var numberOfLines: Int: 문자를 나타내는 최대 라인 수
      • 문자열을 모두 표시하는 데 필요한 만큼 행을 사용하려면 0으로 설정하십시오. 기본 값은 1입니다.
      • 설정한 문자열이 최대 라인 수를 초과하면 lineBreakMode 프로퍼티의 값에 따라 적절히 잘라서 표현합니다
      • adjustsFontSizeToFitWidth 프로퍼티를 활용하면 폰트 사이즈를 레이블의 넓이에 따라 자동으로 조절해줍니다.
    • var baselineAdjustment: UIBaselineAdjustment: 문자열이 Autoshrink 되었을 때의 수직 정렬 방식
      • Align Baseline: 문자가 작아졌을 때 기존 문자열의 기준선에 맞춤
      • Align Center: 문자가 작아졌을 때 작아진 문자의 중앙선에 맞춤
      • None: 문자가 작아졌을 때 기존 문자열의 위쪽 선에 맞춤
    • var lineBreakMode: NSLineBreakMode: 레이블의 경계선을 벗어나는 문자열에 대응하는 방식
      • Character wrap: 여러 줄 레이블에 주로 적용되며, 글자 단위로 줄 바꿈을 결정합니다.
      • Word wrap: 여러 줄 레이블에 주로 적용되며, 단어 단위로 줄 바꿈을 결정합니다.
      • Truncate head: 한 줄 레이블에 주로 적용되며, 앞쪽 텍스트를 자르고 ...으로 표시합니다.
      • Truncate middle: 한 줄 레이블에 주로 적용되며, 중간 텍스트를 자르고 ...으로 표시합니다.
      • Truncate tail: 한 줄 레이블에 주로 적용되며, 끝쪽 텍스트를 자르고 ...으로 표시합니다. 기본 설정 값입니다.

UISlider

  • UISlider는 연속된 값 중에서 특정 값을 선택하는데 사용되는 컨트롤

  • 슬라이더 생성 3단계

    1. 슬라이더 생성 후 슬라이더가 나타내는 값의 범위 지정
    2. 적절한 색상, 이미지 사용해 모양 구성
    3. 하나 이상의 메서드 슬라이더와 연결하기
  • 슬라이더와 메서드 연결하는 방법

    1. addTarget(_: action:for:) 메서드 사용
    2. 인터페이스 빌더에서 연결 @IBAction
  • 슬라이드와 연결되는 메서드 3가지 형식

    func doSomething()
    func doSomething(sender: UISlider)
    func doSomething(sender: UISlider, forEvent event: UIEvent)
  • 슬라이더 주요 메서드

    //  슬라이더의 현재 값 설정
    func setValue(Float, animated: Bool)
    
    //  특정 상태의 minimumTrackImage 반환
    func minimumTrackImage(for: UIControlState) -> UIImage?
    
    // 특정 상태의 minimumTrackImage 설정
    func setMinimumTrackImage(UIImage?, for: UIControlState)
    
    // 특정 상태의 maximumTrackImage 반환
    func maximumTrackImage(for: UIControlState) -> UIImage?
    
    // 특정 상태의 minimumTrackImage 설정
    func setMaximumTrackImage(UIImage?, for: UIControlState)
    
    //  특정 상태의 thumbImage 반환
    func thumbImage(for: UIControlState) -> UIImage?
    
    //특정 상태의 thumbImage 설정
    func setThumbImage(UIImage?, for: UIControlState)

6. 구현 코드 작성하기

  • MARK 사용 : 툴바에 점프할수 있는 메뉴에 추가됨
// MARK:- 주석내용
  • 자동완성에서 원하는 글씨를 입력할때 tab을 누르면 한 단어씩 완성됩니다.

  • AVFoundation

    AVFoundation은 다양한 애플 플랫폼에서 사운드 및 영상 미디어의 처리, 제어, 가져오기 및 내보내기 등 광범위한 기능을 제공하는 프레임워크입니다.

    • 주요 기능
      1. 미디어 재생 및 편집
      2. 디바이스 카메라와 마이크를 이용한 영상 녹화 및 사운드 녹음
      3. 시스템 사운드 제어
      4. 문자의 음성화
  • AVAudioPlayer Class

    파일 또는 메모리에 있는 사운드 데이터를 재생하는 기능을 제공합니다.

    • 주요 기능

      1. 파일 또는 메모리에 있는 사운드 재생
      2. 파일 재생 시간 길이의 제한없이 사운드 재생
      3. 여러 개 사운드 파일 동시 재생
      4. 사운드의 재생 속도 제어 및 스테레오 포지셔닝
      5. 앞으로 감기 , 뒤로 감기 등의 기능을 지원해 사운드 파일의 특정 지점 찾기
      6. 현재 재생 정보 데이터 얻기
      7. 사운드 반복재생 기능
    • 주요 프로퍼티

      • var isPlaying: Bool: 사운드가 현재 재생되고 있는지 아닌지 여부
      • var volume: Float: 사운드의 볼륨값, 최소 0.0 ~ 최대 1.0
      • var rate: Float: 사운드의 재생 속도
      • var numberOfLoops: Int: 사운드 재생 반복 횟수
        • 기본값은 0으로 사운드 1회 재생 후 자동 종료
        • 양수값으로 설정시 설정값+1회 재생(ex. 1로 설정시 2회 재생 후 종료)
        • 음수값으로 설정시 stop 메서드가 호출 될때까지 무한 재생
      • var dutation: TimeInterval: 사운드의 총 재생 시간(초 단위)
      • var currentTime: TimeInterval: 사운드의 현재 재생 시각(초 단위)
      • protocol AVAudioPlayerDelegate: 사운드 재생 완료, 재생 중단 및 디코딩 오류에 응답할 수 있는 프로토콜
    • 주요 메서드

      // AVAudioPlayer 초기화 메서드
      // 특정 위치에 있는 사운드 파일로 초기화 
      func init(contentOf: URL)
      // 메모리에 올라와있는 데이터를 이용해 초기화
      func init(data: Data)
      
      // AVAudioPlayer 재생관련 메서드
      // 사운드 재생
      func play()
      // 특정 시점에서 사운드 재생
      func play(atTime: TimeInterval)
      // 사운드 일시 정지
      func pause()
      // 사운드 재생 정지 
      func stop()
  • Timer

    Timer 클래스는 일정한 시간 간격이 지나면 지정된 메시지를 특정 객체로 전달하는 기능을 제공합니다.

    • 특징

      • 타이머는 런 루프에서 작동합니다.
      • 타이머를 생성시 반복여부를 지정합니다.
        • 비 반복 타이머 : 한 번 실행된 다음 자동으로 무효화 됩니다.
        • 반복 타이머: 동일한 런 루프에서 특정 TimeInterval 간격으로 실행됩니다. 반복되는 타이머 기능을 정지하려면 invalidate() 메서드 호출해 무효화하기
    • 주요 프로퍼티

      • var isValid: Bool: 타이머가 현재 유효한지 아닌지 여부
      • var fireDate: Date: 다음에 타이머가 실행될 시각
      • var timeInterval: TimeInterval: 타이머의 실행 시간 간격(초 단위)
    • 생성 메서드

      // 타이머 생성과 동시에 런 루프에 default mode로 등록하는 클래스 메서드
      class func scheduledTimer(withTimeInterval: TimeInterval, repeats: Bool, block: (Timer) -> Void)
      class func scheduledTimer(timeInterval: TimeInterval, target: Any, selector: Selector, userInfo: Any?, repeats: Bool)
      class func scheduledTimer(timeInterval: TimeInterval, invocation: NSInvocation, repeats: Bool)
      
      // 타이머 생성 후 수동으로 타이머 객체를 add(_:forMode:) 메서드를 이용해 런 루프에 추가해줘야 하는 메서드
      func init(timeInterval: TimeInterval, invocation: NSInvocation, repeats: Bool)
      func init(timeInterval: TimeInterval, target: Any, selector: Selector, userInfo: Any?, repeats: Bool)
      func init(fireAt: Date, interval: TimeInterval, target: Any, selector: Selector, userInfo: Any?, repeats: Bool)

0개의 댓글