부스트코스 “iOS 프로그래밍” 요약정리 - 2. 회원가입 화면 구현 #7
7. Gesture Recognizer
- Ref: 부스트코스 - iOS 프로그래밍
7.1. Gesture Recognizer란?
- 제스처 인식기는 여러 제스처 관련 이벤트를 인식할 수 있다
- 특정 제스처 이벤트가 일어날 때 마다 갓 타깃에 맞는 액션 메시지를 보내어 이벤트 처리 가능
UIGestureRecognizer 클래스
- 특정 제스처 인식기에 대한 동작을 정의
- 델리게이트 객체를 활용하여 일부 동작을 더 세밀하게 사용자화 가능
UIGestrueRecognizer의 하위 클래스
- UITapGestureRecognizer: 싱글탭, 멀티탭 제스처
- UIPinchGestureRecognizer: 핀치제스처
- UIRotationGestureRecognizer: 회전 제스처
- UISwipeGestureRecognizer: 스와이프 제스처
- UIPanGestureRecognizer: 드래그제스처
- UIScreenEdgePanGestureRecognizer: 화면 가장자리 드래그 제스처
- 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
- Tap: 컨트롤을 활성화하거나 항목을 선택
- Drag: 아이템을 좌우 또는 화면으로 드래그
- Flick: 빠르게 스크롤하거나 화면을 넘김
- Swipe: 이전 화면으로 돌아가거나 테이블 뷰에서 숨겨진 삭제 버튼을 표시
- Double tap: 이미지 또는 콘텐츠를 확대하거나 다시 축소
- Pinch: 이미지를 세밀하게 확대하거나 다시 축소
- Touch and hold: 편집 가능한 텍스트 또는 선택 가능한 텍스트에서 수행될 경우 커서 지정을 위한 확대보기가 표시. 컬렉션 뷰의 경우 항목을 재배치할 수 있는 모드로 진입.
- Shake : 실행 취소 또는 다시 실행 얼럿을 띄우기
참고 링크
7.2. Gesture Recognizer의 사용
예제 실습
- TapGesture 프로젝트 생성
- Target-Action 패턴으로 Gesture Recognizer 구현
- 스토리보드로 구현
- 스토리모드 ViewController에 Tap Gesture Recognizer 추가
- ViewController에 tapView()액션 메서드 작성 후 연동
- 코드로 구현
- UITapGestureRecognizer를 ViewController를 타깃으로, tapView()를 액션으로 지정해서 생성
- 생성된 제스처를 view에 추가
- 스토리보드로 구현
- 델리게이트 패턴으로 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