iPhone Application 인터랙티브 씬

  1.  인터랙티브 씬이란? 사용자의 행위에 대한 이벤트를 발생시키는 컨트롤을 의미한다. 대표적인 예로 버튼, 슬라이더, 세그먼티드 컨트롤, 스위치 등이 있다.
    1. 컨트롤이란? 사용자 입력에 반응하는 컨텐츠를 의미한다. 뷰의 자식 클래스이다.
    2. 컨트롤은 사용자 입력에 반응하는 컨텐츠로 이벤트 처리는 코드를 통해서 다루어진다.
      1. 컨트롤 클래스 : UIControl
        1. UIControl에서는 컨텐츠 정렬이나 동작가능한 상태여부 등에 대한 프로퍼티와 메소드를 지원한다.
      2. 컨트롤과 이벤트
        1. 사용자 이벤트
          1. 터치하기
          2. 터치한 채로 컨트롤 영역 내에서 이동
          3. 터치한 채로 컨트롤 영역 밖으로 이동
          4. 터치했다가 떼기
        2. 이벤트 처리
          1. 이벤트를 처리하는 객체인 타겟과 처리 행위인 액션으로 이루어지며, Storyboard와 코드에서 모두 연결가능하다.
          2. 타겟 - 액션 - 이벤트 등록/해제 메소드
            1. 등록 : func addTarget(_ target: Any?, action: Selector, for controlEvent: UIControlEvents)
            2. 해제 : func removeTarget(_ target: Any?, action: Selector, for controlEvent: UIControlEvents)
            3. UIControlEvents 값
              1. touchDown : 컨트롤에 터치가 닿는 이벤트
              2. touchDragExit : 터치가 컨트롤 밖으로 나가는 이벤트
              3. touchUpInside : 터치가 내부에 닿았다가 떨어지는 이벤트
              4. valueChanged : 값이 변경되는 이벤트
  2. 버튼 다루기
    1. 버튼은 사용자가 타겟에 누르는 행위(액션)로 이벤트가 발생되는 컨트롤이다.
    2. 특징
      1. 사용자의 간단한 행위(누르기)
      2. 이미지와 글자 출력
      3. 버튼의 상태별 이미지와 글자
    3. 속성
      1. 버튼 타입 : custom(사용자 정의), System(시스템에서 지원), 미리 정의된 형태의 버튼 등의 종류가 있다.

      2. 버튼 상태별 이름과 이미지로 가능 : 제목만 구성, 이미지로만 구성, 제목과 이미지로 구성

      3. 글자색과 그림자 색, 위치 선정 가능 : 아래 설정항목에서 변경 가능하다.

      4. 버튼의 상태와 사용자 동작
        1. Default : 보통 상태로 사용 가능
        2. Highlighted : 터치 중인 상태
        3. Focused : 포커스된 상태
        4. Selected : 선택된 상태
        5. Disabled : 사용자 터치 이벤트 동작 안 함
    4. 코드로 버튼의 속성을 다룰 수 있다.
      1. 버튼 클래스 : UIButton
      2. 버튼 타입 : UIButtonType이며, custom, system, detailDisclosure 등 설정가능하다.
      3. 버튼 생성과 씬에 배치하는 것은 아래와 같이한다.
        버튼 생성과 씬 배치
        // 커스텀 버튼
        let customButton = UIButton(frame: CGRect(x: 50, y: 50, width: 100, height: 50))
        self.view.addSubview(customButton)

        // 미리 정의된 버튼 타입 설정
        let infoButton = UIButton(type: .infoLight)
        // 버튼 크기는 미리 정해짐
        infoButton.center = CGPoint(x: 50, y: 150)
        self.view.addSubview(infoButton)
      4. 버튼 상태 설정관련 메소드
        1. 버튼 이름 : func setTitle(_ title: String?, for state: UIControlState)
        2. 버튼 이름 색 : func setTitleColor(_ color: UIColor?, for state: UIControlState)
    5. 버튼 이벤트 다루기
      1. Storyboard에서 버튼 이벤트 다루기
        1. 액션 생성 다이얼로그를 이용해서 뷰 컨트롤러에 메소드를 생성한다.

        2. 생성된 액션 메소드는 @IBAction 키워드가 추가된 메소드이다.
        3. 버튼에서 어떤 액션이 발생했을 때 메소드를 실행할지는 아래 설정에서 선택할 수 있다.

      2. 코드로 버튼 이벤트 다루기
        1. 코드에서 이벤트를 다루는 것은 아래 예제로 설명할 수 있다.
          코드로 이벤트 다루기
          override func viewDidLoad() {
             // 버튼 생성 및 씬에 추가
             let button = UIButton(frame: CGRectMake(20, 200, 100, 50))
             self.view.addSubview(button)

             // 버튼의 Touch Up Inside 이벤트 추가
             // 타겟 - 액션 - 이벤트
             button.addTarget(self, action: #selector(handleClickByCode(_:)), forControlEvents:.touchUpInside)
          }

          func handleClickByCode(_ sender : Any){
            // 발생할 이벤트 처리
            print("handleClickByCode")
          }

  3. 사용자 선택(변경) 컨트롤
    1. 사용자 선택을 다루는 컨트롤로 단순 클릭 이벤트보다는 선택된 항목의 변경 시에 이벤트 처리가 이루워진다.
    2. 사용자 선택 컨트롤은 항목 변경이 발생하는 valueChanged 시에 이벤트 처리를 한다.
    3. 종류
      1. 세그먼티드 컨트롤 : 문자와 이미지 기반의 여러 항목 중에 하나를 선택하는 컨트롤이다.
        1. 형태는 아래와 같다.

        2. Storyboard에서 세그먼티드 컨트롤 다루기

        3. 코드로 세그먼티드 컨트롤 다루기
          1. 세그먼티드 컨트롤 클래스 : UISegmentedControl
          2. 문자열이나 이미지를 담은 배열을 생성 : init(items : [Any]?)
          3. 문자열로 생성
            문자열로 세그먼티드 컨트롤 생성
            let items = ["First", "Second", "Third"]
            let segmented = UISegmentedControl(items: items)
            self.view.addSubview(segmented)
          4. 세그먼티드의 타이틀, 이미지 설정
            세그먼티드의 타이틀, 이미지 설정
            // 타이틀 설정
            func setTitle(_ title: String?, forSegmentAt segment: Int)
            // 이미지 설정
            func setImage(_ image: UIImage?, forSegmentAt segment: Int)
          5. 세그먼티드의 타이틀, 이미지 얻기
            세그먼티드의 타이틀, 이미지 얻기
            // 타이틀 얻기
            func titleForSegmentAtIndex(_ segment: Int) -> String?
            // 이미지 얻기
            func imageForSegmentAtIndex(_ segment: Int) -> UIImage?
        4. 세그먼티드 컨트롤의 이벤트 다루기
          1. 주요관심 이벤트는 선택항목의 변경으로 항목 변경 이벤트는 valueChanged이다.
          2. Storyboard에서 이벤트 다루기
            1. ViewController로 연결

          3. 코드에서 이벤트 다루기
            1. addTarget(self, action: #selector(handleSegmentChanged(_:)), forControlEvents: .valueChanged)로 이벤트처리 함수 연결
          4. 발생한 이벤트 다루기
            Sender를 이용하여 선택된 이벤트 처리
            // 이벤트 처리 부분 구현
            func handleSegementChanged(_ sennder: Any) {
              let segment = sender as! UISegmentedControl
            /* func handleSegementChanged(_ sennder: UISegmentedControl) { */
              switch segment.selectedSegmentIndex {
              case 0: print("소나기")
              case 1: print("천둥,번개")
              default: print("맑음")
              }
            }
  4. 씬의 메뉴 구성
    1. 툴바와 툴바 내의 버튼
      1. 툴바: 메뉴를 의미한다.
      2. 툴바 내의 바 버튼 아이템 : 메뉴 내 항목을 의미한다.
      3. 아래와 같이 나타낼 수 있다.

    2. Storyboard에서 툴바 다루기
      1. 툴바 속성은 아래 설정에서 변경할 수 있다.

      2. 툴바 내의 바 버튼 아이템은 아래 설정에서 변경할 수 있다.

    3. 코드로 툴바 다루기
      1. 툴 바 클래스 : UIToolBar
      2. 툴 바 내의 바 버튼 아이템 : items 프로퍼티 (var items: [UIBarButtonItem]?)
        1. 시스템 바 버튼 설정
          init(barButtonSystemItem systemItem: UIBarButtonSystemItem, target: Any?, action: Selector?)
        2. 텍스트 기반의 바 버튼 설정
          init(title: String?, style: UIBarButtonItemStyle, target: Any?, action: Selector?)
        3. 이미지 기반의 바 버튼 설정
          init(image: UIImage?, style: UIBarButtonItemStyle, target: Any?. action: Selector?)
    4. 툴바와 툴 바 버튼 아이템 이벤트 다루기
      1. Storyboard에서 이벤트 다루기
        1. ViewController로 연결

      2. 코드에서 이벤트 다루는 예제
        툴바, 툴바 내의 바 버튼 이벤트 처리 예제
        let toolbar = UIToolbar()
        // 이미지 기반의 바 버튼 생성
        let image = UIImage(named: "button")!
        let imageBarButton = UIBarButtonItem(image: image, style: .plain, target: self, action: #selector(handleImageButton(_:)))
        // 텍스트 기반의 바 버튼 생성
        let tb =  UIBarButtonItem(title: "문자열 버튼", style: .plain, target: self, action: #selector(handleEvent))
        // 시스템 바 버튼 생성
        let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(handleDone))

        toolbar.items = [imageBarButton, tb, doneButton]
        self.view.addSubview(toolbar)
  5. 액티비티 인디케이터
    1. 현재 사용자가 발생 시킨 이벤트가 동작 중인지를 알리는 목적의 뷰이다.
      1. 동작이 완료된 후에는 숨기도록 한다.
      2. 다른 뷰보다 상위에 배치한다.
      3. 시작 메소드 : func startAnimating()
      4. 중지 메소드 : func stopAnimating()
      5. 시작/중지 상태 확인 메소드 : isAnimating() -> Bool
      6. 자동 숨기기 프로퍼티 : var hidesWhenStopped: Bool
    2. Storyboard에서 인디케이터 다루기

    3. 코드로 액티비티 인디케이터 다루기
      1. 클래스 : UIActivityIndicatorView -> init(activityIndicatorStyle style: UIActivityIndicatorViewStyle)
      2. 스타일 : whiteLarge, white, gray
    4. 스위치를 이용한 액티비티 인디케이터 사용 예제
      스위치를 활용한 액티비티 인디케이터 사용 예제
      func switchChanged(_ sender: AnyObject) {
         let onOffSwitch = sender as! UISwitch
         if onOffSwitch.isOn {
              // 스위치가 켜지면 액티비티 인디케이터 시작
              indicator.startAnimating()
         } else {
             // 꺼지면 액티비티 인디케이터 중지
             indicator.stopAnimating()
         }
      }