부스트코스 “iOS 프로그래밍” 요약정리 - 2. 회원가입 화면 구현 #7

Updated:

7. Gesture Recognizer




7.1. Gesture Recognizer란?

  • 제스처 인식기는 여러 제스처 관련 이벤트를 인식할 수 있다
  • 특정 제스처 이벤트가 일어날 때 마다 갓 타깃에 맞는 액션 메시지를 보내어 이벤트 처리 가능

UIGestureRecognizer 클래스

  • 특정 제스처 인식기에 대한 동작을 정의
  • 델리게이트 객체를 활용하여 일부 동작을 더 세밀하게 사용자화 가능

UIGestrueRecognizer의 하위 클래스

  1. UITapGestureRecognizer: 싱글탭, 멀티탭 제스처
  2. UIPinchGestureRecognizer: 핀치제스처
  3. UIRotationGestureRecognizer: 회전 제스처
  4. UISwipeGestureRecognizer: 스와이프 제스처
  5. UIPanGestureRecognizer: 드래그제스처
  6. UIScreenEdgePanGestureRecognizer: 화면 가장자리 드래그 제스처
  7. UILongPressGestureRecognizer: 롱프레스 제스처
  • 제스처 인식기 사용을 위해 타깃-액션 연결 설정 후 UIView의 addGestureRecognizer() 메서드를 통해 뷰에 연결한다.
  • 제스처가 인식 되면 해당 제스처 이벤트에 연결된 타깃에 액션 메시지가 전달되며 호출되는 액션 메서드는 아래 구현 형식 중 하나여야 한다.
@IBAction func myActionMethod()
@IBAction func myActionMethod(_ sender: UIGestureRecognizer)
  • 윈도우는 뷰에 터치 이벤트를 전달하기 전에 뷰에 추가된 제스처 인식기에 전달한다.
    • 제스처 인식기가 터치 이벤트를 인식했을 경우 뷰는 터치 이벤트를 받지 못함
    • 제스처 인식기가 터치 이벤트를 인식하지 못했을 경우 뷰가 받게됨

UIGestrueRecognizer의 주요 메서드

  • init(target: Any?, action: Selector?): 제스처 인식기를 타깃-액션의 연결을 통해 초기화
  • func location(in: UIView?) -> CGPoint: 제스처가 발생한 좌표를 반환
  • func addTarget(Any, action: Selector): 제스처 인식기 객체에 타깃과 액션을 추가
  • func removeTarget(Any?, action: Selector?): 제스처 인식기 객체로부터 타깃과 액션을 제거
  • func require(toFail: UIGestureRecognizer): 여러 개의 제스처 인식기를 가지고 있을 때, 제스처 인식기 사이의 의존성을 설정

UIGestureRecognizer의 주요 프로퍼티

  • state: UIGestureRecognizerState: 현재 제스처 인식기의 상태
  • view: UIView?: 제스처 인식기가 연결된 뷰
  • isEnabled: Bool: 제스처 인식기가 사용 가능한 상태인지
  • cancelsTouchInView: 제스처가 인식되었을 때 터치 이벤트가 뷰로 전달되는 여부에 영향을 미친다
    • 이 프로퍼티가 true(기본값)이고 제스처 인식기가 제스처를 인식했다면, 해당 제스처의 터치는 뷰로 전달되지 않는다. 이전에 전달된 터치들은 touchesCancelled(_:with:) 메시지를 통해 취소된다
    • 제스처 인식기가 제스처를 인식 못하거나 이 프로퍼티의 값이 false라면 뷰가 모든 터치를 전달받게 된다
  • delaysTouchesBegan: began 단계에서 제스처 인식기가 추가된 뷰에 터치의 전달 지연 여부를 결정
  • delaysTouchesEnded : end 단계에서 제스처 인식기가 추가된 뷰에 터치의 전달 지연 여부를 결정

iOS의 Standard Gesture

  1. Tap: 컨트롤을 활성화하거나 항목을 선택
  2. Drag: 아이템을 좌우 또는 화면으로 드래그
  3. Flick: 빠르게 스크롤하거나 화면을 넘김
  4. Swipe: 이전 화면으로 돌아가거나 테이블 뷰에서 숨겨진 삭제 버튼을 표시
  5. Double tap: 이미지 또는 콘텐츠를 확대하거나 다시 축소
  6. Pinch: 이미지를 세밀하게 확대하거나 다시 축소
  7. Touch and hold: 편집 가능한 텍스트 또는 선택 가능한 텍스트에서 수행될 경우 커서 지정을 위한 확대보기가 표시. 컬렉션 뷰의 경우 항목을 재배치할 수 있는 모드로 진입.
  8. Shake : 실행 취소 또는 다시 실행 얼럿을 띄우기

참고 링크




7.2. Gesture Recognizer의 사용

예제 실습

  1. TapGesture 프로젝트 생성
  2. Target-Action 패턴으로 Gesture Recognizer 구현
    • 스토리보드로 구현
      • 스토리모드 ViewController에 Tap Gesture Recognizer 추가
      • ViewController에 tapView()액션 메서드 작성 후 연동
    • 코드로 구현
      • UITapGestureRecognizer를 ViewController를 타깃으로, tapView()를 액션으로 지정해서 생성
      • 생성된 제스처를 view에 추가
  3. 델리게이트 패턴으로 Gesture Recognizer 구현
    • UIGestureRecognizerDelegate 프로토콜 추가
    • UITapGestureRecognizer 인스턴스 생성
    • 델리게이트로 ViewConroller 등록
    • 생성된 제스처를 view에 추가
    • 델리게이트 메서드 작성
  • 델리게이트 패턴 사용하면 더 다양한 상황에 맞는 다양한 동작을 제어할 수 있다
  • 단순한 처리만 하려면 Target-Action 패턴 사용해도됨
  • 상황에 맞게 적절히 사용하자

UITextField

  • 사용자 인터페이스에서 편집 가능한 텍스트 영역
  • 키보드를 통해 입력하는 문자열 데이터 활용 가능
  • Target-Action 패턴, 델리게이트 패턴 사용해서 텍스트 편집 이벤트 다룬다

키보드 보여주기/숨기기

  • 텍스트 필드를 탭하면 자동으로 텍스트 필드가 first responder가 되면서 시스템이 키보드를 보여주고, 키보드 입력을 하면 텍스트 필드에 텍스트가 입력됨
  • 보여주기 방법
    • 텍스트 필드를 탭하면 자동으로 키보드 보여줌
    • becomeFirstResponder() 메서드 직접 호출
  • 숨기기 방법
    • resignFirstResponder() 또는 endEditing() 메서드 호출

인터페이스 빌더에서 설정 가능한 속성

텍스트필드 델리게이트

  • 델리게이트 객체의 도움을 받아 텍스트 편집 이벤트 등을 관리
  • UITextFieldDelegate 참조

주요 프로퍼티

  • delegate: UITextFieldDelegate?: 텍스트 필드의 델리게이트 객체
  • text: String?: 텍스트 필드에 보여지는 문자열
  • placeholder: String?: 텍스트 필드에 아무것도 입력되어 있지 않을 때 기본으로 보이게 되는 문자열
  • font: UIFont?: 텍스트의 폰트를 설정
  • textColor: UIColor?: 텍스트의 색상을 설정
  • textAlignment: NSTextAlignment: 텍스트의 정렬을 설정
  • isEditing: Bool: 현재 텍스트 필드가 편집 모드에 있는지
  • background: UIImage?: 텍스트 필드가 enable 되어 있을 때의 배경 이미지
  • disabledBackground: UIImage?: 텍스트 필드가 disabled 되어 있을 때의 배경 이미지
  • clearButtonMode: UITextFieldViewMode: 텍스트 필드의 텍스트를 모두 지울 수 있는 컨트롤을 텍스트 필드에 나타나게 함

UITextFieldDelegate 프로토콜의 주요 메서드

  • textFieldShouldBeginEditing(UITextField): 델리게이트 객체에게 텍스트 필드에서 텍스트 편집을 시작을 요청

  • textFieldDidBeginEditing(UITextField): 델리게이트에게 텍스트 필드에서 텍스트 편집이 시작되었음을 델리게이트 객체에게 알림

  • textField(UITextField, shouldChangeCharactersIn: NSRange, replacementString: String): 델리게이트 객체에게 현재 텍스트의 수정을 요청

  • textFieldShouldEndEditing(UITextField): 델리게이트 객체에게 텍스트 편집 중지를 요청

참고 링크

Leave a comment