-
[Apple Dev Reference] iOS에서 텍스트 프로그래밍하기앱등이에게 살충제를 뿌린다./Apple Dev Reference 2016. 2. 21. 23:56
Apple Developer 문서를 번역만 하였습니다.
Managing the Keyboard
사용자가 TextField, TextView 또는 웹뷰에 있는 입력필드를 터치했을 때 시스템에서 키보드가 보여지게 됩니다. 키보드의 여러 속성에 따라 어떤 키보드를 보여줄지 설정할 수가 있습니다. 또한 에디팅이 시작되거나 끝날 때에 키보드를 어떻게 처리할 지도 결정할 수가 있습니다. 포커스되어 있는 부분을 키보드가 가리게 될 수도 있기 때문입니다. 따라서 포커스되는 부분을 키보드영역위로 올라오게 하여 포커스된 UI가 잘 보이게 하는 방법도 이에 포함됩니다.
Keyboards and Input Methods
사용자가 input이 가능한 객체를 터치할 때마다 이 객체는 시스템에게 적절한 키보드를 띄우라고 요청을 보내게 됩니다. 앱의 요구사항과 사용자의 선호하는 언어에 따라 시스템에서는 그에 맞는 키보드를 보여주게 됩니다.
Configuring the Keyboard for TextObjects
앱의 텍스트 관련 객체에서 키보드의 속성을 미리 설정할 수가 있습니다. UITextField와 UITextView는 둘다 UITextInputTraits 프로토콜을 따르고 있는데요, 이 프로토콜은 적절한 키보드를 고르는데 필요한 속성들을 정의하고 있습니다. 이런 속성을 코드나 스토리보드에서 지정하게 되면 시스템은 지정된 키보드를 보여주게 될 겁니다.
디폴트 키보드는 일반적인 텍스트 인풋을 하기 위한 디자인입니다. 그림에서는 디폴트 키보드와 몇가지 다른 키보드들을 보여주고 있습니다. 디폴트 키보드에서는 알파벳만 나와있지만 사용자가 숫자나 특수문자를 입력하기 위해 선택하는 버튼도 있습니다. 다른 키보드들도 대부분 디폴트 키보드와 비슷하지만 해당 목적을 위한 몇 가지 특수한 버튼이 차이점으로 나타납니다. Phone용 키보드에서는 완전히 다른 레이아웃으로 나타나게 되네요.
여러 언어 입력을 구현하기 위해서 iOS에서는 여러가지의 입력 방법과 키보드 레이아웃을 제공하고 있습니다. 입력 방법과 키보드 레이아웃은 사용자의 선호언어에 따라 결정됩니다.
Configuring the Keyboard for Web Views
UIWebView가 UITextInputTraits 프로토콜을 따르지는 않지만 input태그의 속성에 따라 키보드 타입을 결정할 수 있습니다. 예를 들어 autocorrect, autocapitalize속성을 input태그에서 사용하여 키보드에서 이 기능이 작동하게 할 수 있습니다.
<input type="text" size="30" autocorrect="off" autocapitalize="on">
또한 어떤 종류의 키보드를 보여지게할지 결정할 수도 있습니다. input태그에서 Telephone키패드를 띄우고 싶다면 type으로 tel을, E-mail용 키보드를 띄우고 싶다면 type으로 email을, URL 키보드를 띄우고 싶다면 type으로 url을 지정해주면 됩니다. 또 숫자 키패드를 띄우고 싶다면 pattern속성으로 "[0-9]*" 또는 "\d*"을 입력해주면 됩니다.
- Text: <input type="text"></input>
- Telephone: <input type="tel"></input>
- URL: <input type="url"></input>
- Email: <input type="email"></input>
- Zip code: <input type="text" pattern="[0-9]*"></input>
Managing the Keyboard
많은 UIKit 객체들은 자동으로 키보드를 작동시키지만, 여러 경우에 따라 여전히 키보드를 관리해야할 필요가 있습니다. 아래에서 이에 대해 설명합니다.Receiving Keyboard Notifications
키보드가 나타나거나 사라질 때, iOS는 아래의 노티피케이션을 모든 등록된 옵저버에 보냅니다.각각의 키보드 노티피케이션은 키보드의 크기와 위치에 대한 정보를 포함하고 있습니다. 여러분은 UIKeyboardFrameBeginUserInfoKey와 UIKeyboardFrameBeginUserInfoKey를 사용하는 노티피케이션의 userInfo딕셔너리 객체에서 이 정보를 가져와 사용할 수 있습니다. 전자는 beginning키보드 프레임에 대한 값을 제공하고 후자는 ending 키보드에 대한 프레임을 제공합니다.(둘다 스크린상의 좌표체계를 이용합니다.) 키보드의 값들을 예상해서 사용하지 말고 항상 노티피케이션에서 가져와서 사용하도록 해야합니다. 입력 방법에 따라 키보드의 크기가 달라지기도 하고 iOS버전에 따라서도 달라지기도 합니다. 뿐만 아니라 같은 버전의 iOS에서 같은 언어로 입력을 한다고 해도 디바이스의 Orientation상태(디바이스 회전)에 따라서도 크기가 달라지게 됩니다. 그림에서 Portrait모드와 Landscape모드에서의 키보드 크기를 나타내고 있습니다. 노티피케이션에서 제공하는 키보드의 값들을 사용하면 항상 정확한 크기를 사용할 수 있게 될 것입니다.Note : userInfo의 UIKeyboardFrameBeginUserInfoKey와 UIKeyboardFrameBeginUserInfoKey프로퍼티에 있는 Rectangle에서 Size정보만 사용하셔야 합니다. Origin정보는 Rectangle관련 연산에 사용하지 마세요. 왜냐하면 이 Origin값들은 키보드가 애니메이션을 함에 따라 그 rectangle값들이 시간에 따라 조금씩 변하기 때문입니다.
이 노티피케이션을 사용하는 이유는 키보드가 나타나거나 사라질 때 화면의 컨텐츠의 위치를 재조정하기 위함입니다. 이런 시나리오를 다루기 위한 정보는 Moving Content That Is Located Under the Keyboard.을 확인해보세요.
Displaying the Keyboard
사용자가 View를 터치하게 되면 시스템은 자동으로 그 뷰를 First Responder로 지정하게 됩니다. 이런 상황이 Text Edit가 가능한 View에서 일어나게 된다면 View는 Editing Session을 시작합니다. Editing Session가 시작될 때 View는 키보드가 떠있지 않는 상태라면 시스템에 키보드를 보여줄 것인지 물어보게 됩니다. 만약 키보드가 이미 떠있다면 키보드 인풋이 새롭게 first responder가 된 뷰로 이동하게 됩니다.
View가 first responder가 될 때 자동으로 키보드가 나타나기 때문에 키보드를 띄우는데 딱히 뭘 할필요가 없는 경우가 많습니다. 하지만 사용자가 input을 해야하는 View를 터치하지 않고도 키보드를 보여줄 수가 있습니다. 해당 뷰의 becomeFirstResponder메소드를 호출하게 되면 자동으로 키보드가 보여지게 되고 target View가 first responder가 되게 됩니다. 그리고 input또한 가능해집니다. 마치 사용자가 그 View를 터치하여 입력을 하고자 할 때와 똑같이 말입니다.
하나의 화면에 여러 개의 input을 위한 View를 갖고 있다면 현재 어떤 View가 first responder인지를 추적하여 적절한 시점에 키보드를 사라지게 해주는 것 또한 좋은 방법입니다.
Dismissing the Keyboard
시스템은 키보드를 보통 자동으로 보여주지만 자동으로 감추지는 않습니다. 따라서 앱에서 적절한 타이밍에 키보드를 감춰줘야 합니다. 보통은 사용자들의 이벤트에 따라 이루어집니다. 예를 들어, 사용자가 Return이나 Done버튼을 누르거나 앱의 UI중 다른 부분을 터치했을 경우에 키보드가 사라지기를 기대하게 됩니다.
키보드를 사라지게 하려면 현재 firstResponder인 뷰의 resignFirstResponder메소드를 호출하면 됩니다. 텍스트 뷰가 firstResponder인 상태를 resign하게 되면 이 뷰는 Editing session을 마치게 되고 뷰의 delegate에 이 사실을 알린 뒤 키보드를 사라지게 합니다. 다시 말해서, 만약에 myTextField라는 변수명을 갖는 UITextField가 현재 firstResponder라고 가정할 때, 키보드를 사라지게 하려면 아래와 같이 작성하면 됩니다.
[myTextField resignFirstResponder];
Moving Content That Is Located Under the Keyboard
시스템이 키보드를 띄우게 되면, 화면의 바닥에서부터 키보드가 올라오게 됩니다. 키보드가 다 올라오면 앱의 컨텐트를 가리게 되는 경우가 생깁니다. 이 때, 텍스트 입력 객체 위로 키보드가 올라오게 되면 사용자가 입력하고자 하는 View가 보이지 않게 됩니다. 이런 경우에는 여러분이 View의 위치를 조절하여 View가 계속 보일 수 있게 해주어야 합니다.
Content를 조정하는 것은 주로 임시로 몇 개의 View를 리사이징하여 재배치한 뒤 계속 보이게 하는 작업을 포함합니다. 가장 간단한 방법은 Text객체와 키보드를 UIScrollView (또는 UITableView)에 같이 넣는 것입니다. 키보드가 나타날 때, 여러분이 해줄 작업은 ScrollView의 Content의 영역을 리셋해주는 작업이 전부입니다. 따라서, UIKeyboardDidShowNitification에 대응하여 여러분의 Handler Method는 아래와 같은 조건을 만족시키면 됩니다.
- 키보드의 크기를 알아낸다.
- ScrollView의 아랫부분 사이즈를 키보드의 크기만큼 조정한다.
- Target이 되는 Text View의 위치를 그 위에 위치하게 한다.
아래 그림은 몇개의 textField를 하나의 UIScrollView에 넣은 뒤 input작업을 하는 과정을 보여주고 있습니다. 키보드가 나타날 때, 노티피케이션 핸들러 메소드가 컨텐트와 스크롤 위치를 조정한 뒤, scrollRectToVisiblke:animated:메소드를 사용하여 text view를 적절한 위치에 이동시키고 있습니다.
아래 코드는 키보드 노티피케이션을 등록하고 그 노티피케이션들에 대한 핸들러 메소드를 보여주고 있습니다. scrollView를 제어하는 ViewController에서 이 코드를 작성해야 합니다. keyboardWasShown:메소드는 노티피케이션의 info 딕셔너리에서 키보드의 사이즈를 가져온 뒤 스크롤뷰에서 target view의 위치를 조정해줍니다. 이 메소드에서 scrollIndicatorInsets프로퍼티도 설정하여 scrolling indicator가 키보드에 의해 가려지지 않게 해줍니다. keyboardWillBeHidden:메소드는 키보드의 크기를 사용하지 않는다는걸 알아두세요. 단순히 scrollView의 contentInset과 scrollIndicatorInsets프로퍼티를 디폴트값인 UIEdgeInsetsZero로 만들어 주기만 합니다.현재 활성화된 텍스트필드가 키보드에 의해 가려져있다면 keyboardWasShown:메소드가 컨텐트의 위치를 적절하게 조절해줄 것입니다.Handling the keyboard notifications'앱등이에게 살충제를 뿌린다. > Apple Dev Reference' 카테고리의 다른 글
[Apple Dev Reference] NSURLSession에 대해서 (0) 2016.03.27 [Apple Dev Reference] About Dates and Times 시간/날짜관련 API (0) 2016.02.27 [Apple Dev Reference] KVO - Key-Value Observing Programming Guide (2) 2016.01.17 [Apple Dev Reference] 앱 라이프사이클 The App Life Cycle (3) 2016.01.10 [Apple Dev Reference] NSURL Class 초간단소개 by Apple Reference (0) 2015.12.04