Apple OS 제공 Notification 은 헤더파일에 선언없이
메인 Controller.m 파일에 선언하여 사용할 수 있다.
궁금증 1.
현재 DrinkMixer 앱에는 키보드를 사용하는 곳이 3곳이다.
UITextField (제목)
UITextView 2개 (재료, 레시피)
여기서 UITextField 의 키보드는 전에 공부한데로
IB에서 키보드의 리턴타입의 변경과
최초응답자의 자리에서 물러나게 하는 메시지
[sender resignFirstResponder]
를 사용하여 키보드를 사라지게 할 수 있었다.
그런데 UIScrollView에서는 키보드가 사라지지 않는다.
이벤트 영역이 나오지가 않는다 어떻게 사라지게 할 수 있을까?
검색 후 제일 근접한 결과
-
[textView resignFirstResponder] 를 써서 Done 버튼을 누를때 상위에 안보이는 View 하나를 띄워
Done 대신 그 뷰가 눌리게 이벤트 처리 하면 될 듯 한데요. 해보진 않았습니다.
일단 문제는 textView는 done이라는 버튼을 이용하는 특성이 아니라 enter와 같은
다음 라인으로 넘어가기 위한 기능을 가지고 있다는 것이 이렇게 발목을 잡는 것 같습니다.
어쩔수 없이 상위 우측에 완료 버튼을 만들고 리스폰더 처리를 하실수 밖에 없는 것 같더군요
textView 는 기존 textField와 달리 Done 처리할 키가 엔터값을 가지고 있다. --어쩐지 이벤트가 안나오더라.
처리방법을 함 고심해보자.
여기서 영어는 안돼지만 라이브러리를 함 뒤져보자
Text Views
UILabel : 정적 텍슽츠 문자열을 출력한다.
UITextField : 싱글 라인의 편집 가능한 텍스트를 출력한다.
UITextView : 다중 라인의 편집 가능한 텍스트를 출력한다.
레이블과 텍스트 필드가 대게 상대적으로 작은 양의 텍스트를 사용하긴 하지만,
이들 클래스는 대용량 텍스트의 출력을 지원한다.
아이폰 OS 기반 장치의 작은 화면에서 출력된 텍스트를 읽기 쉽게 만들 수 있는
맥 OS X 같은 데스크탑 운영체제에서 찾을 수 있는 진보된 포멧류를 이들 클래스는 지원하지 않는다.
그래도 이들 세개의 클래스는 크기와 스타일링 옵션을 포함하여 폰트의 정보를 특정할 수 있게 한다.
하지만 당신이 특정한 폰트 정보는 객체에 관련된 텍스트 모두에 적용된다.
위의 화면에 텍스트가 나타날 때 사용 가능한 텍스트 클래스의 예를 보연준다.
이들 예는 UIKit 에서 사용 가능한 많은 뷰와 컨트롤을 시연하는 UICatalog 샘플 어플리케이션에서 가져왔다.
오른쪽 이미지는 싱글 텍스트 뷰를 보여주는 반면, 왼쪽 이미지는 몇가지 다른 스타일의 텍스트 필드를 보여준다.
회색 백그라운드에 표시된 콜 아웃(함수 호출 결과)은 다른 뷰에 출력하는 데 사용되는
테이블 셀내에 임베드(영:끼워넣다. 깊이 새겨두다. 라이브러리에 import 한 것. 이미지 및 폰트, 사운드 등 단 심볼은
임베드 한다고 하지 않는다) 된 UILabel 객체 그 자체 이다.
화면의 왼쪽 하단에 "Left View" 텍스트를 지닌 UILabel 객체도 있다.
편집 가능한 텍스트 뷰를 작업할 때, 편집 세션을 관리하기 위해 대표 객체를 항상 제공해야만 한다.
텍스트 뷰는 언제 에디팅이 시작되는 지, 언제 끝나는지를 대표 객체에 알리기 위해, 그리고 에디팅 액션을
오버라이드 할 수 있는 기회를 제공하기 위해 대표 객체에 몇몇 다른 공지를 전송한다.
예를 들어, 현재 텍스트가 적합한 값을 가지고 있고, 아직 에디팅이 끝나지 않았다면 에디팅 세션을 종료하지
않도록 대표 객체는 결정할 수 있다.
마침내 에디팅이 끝나면, 결과 텍스트 값을 얻기 위해, 그리고 애플리케이션 데이터 모델을 업데이트 하기 위해
대표 객체를 사용한다.
그들의 의도된 사용법에는 약간 차이가 있으므로, 각 텍스트 뷰의 대표 메소드 역시 약간다르다.
UITextField 클래스를 지원하는 대표는 UITextFieldDelegate 프로토콜의 매소드를 구현한다.
이와 유사하게, UITextView 클래스를 지원하는 대표는 UITextViewDelegate 프로토콜의 메소드를 구현한다.
(아항 요 부분이 틀렸구나.. !! 유레카~~!!)
양쪽 모두의 경우 어떤 프로토콜 메소드도 구현할 필요는 없지만, 구현하지 않는다면, 텍스트 필드는
당신에게 쓸만하지 않을 것이다. (결국 커스터마이징이 필요하다.)
두 프로토콜에서 메소드에 관한 추가 정보에 대해서는
UITextFieldDelegate Protocol Reference 와 UITextViewDelegate Protocol Reference 를 보라.
(썅 이것도 해석해야 하잖아... 애플 미워)
하지만 연관되어 있으므로 일단 웹뷰 부터 공부하고 저 부분을 알아보자
Web View 웹뷰
UIWebView 클래스는 당신의 애플리케이션 유저 인터페이스로 필수적인 축소 웹 브라우저를 통합할 수 있게 한다.
UIWebView 클래스는 HTML, CSS, 자바 스크립트 컨텐츠에 대한 완전한 지원을 포함하여
아이폰 OS에서 사파리를 구현하는 데 사용된 동일한 웹 기술을 모두 사용할 수 있다.
또한 클래스는 사용자가 사파리에서 익숙하게 사용한 기제작된 제스쳐의 많은 부분을 지원한다.
예를 들어, 더블 클릭, 페이지 줌인/아웃 하는 핀치를 할 수 있고,
손가락을 드래깅 함으로써 페이지를 스크롤 할 수 있다.
컨텐츠를 출력하는 것에 더해, 웹 폼을 사용하여 사용자로부터 입력을 받는 웹 뷰 객체를 사용할 수도 있다.
UIKit 에서 다른 텍스트 클래스에서처럼, 웹 페이지 폼에 편집 가능한 텍스트 필드가 있을때,
그 필드를 탭핑(두드리는 것)하면, 사용자가 텍스트를 입력할 수 있는 키보드가 나타날 것이다.
그는 웹 경험의 필수 구성요소이기에,
웹 뷰 스스로 키보드 출력을 관리하고, 키보드 해제를 관리한다. (뭐여 좋잖아...)
위의 그림은 UIKit에서 사용하는 많은 뷰와 컨트롤을 시연하는 UICatalog 샘플 애플리케이션으로부터
UIWebView 객체의 예를 보여준다.
HTML 컨텐츠 만을 출력하므로, 웹 브라우저 처럼 사용자가 페이지를 탐색할 수 있게 하길 원한다면,
그러한 컨트롤을 추가해야만 한다.
예를 들어, 그림의 웹 뷰는 타겟 URL 를 지닌 텍스트 필드 밑에 공간을 차지하지만 텍스트 필드 그 자체를
포함하지 않는다.(주소 넣는 텍스트 필드는 디폴트로 제공하지 않는다 - 뭐여 장난혀 )
웹 뷰는 그에 연관된 대표 객체를 통해 언제 페이지가 로드되는지, 로딩시 에러가 있는지에 대한 정보를 제공한다.
웹 대표는 UIWebViewDelegate 프로토콜의 하나 이상의 메소드를 구현하는 객체이다.
대표 메소드의 구현으로 웹 페이지 로딩에 대한 기타 작업의 실패나 수행에 대해 반응할 수 있다.
UIWebViewDelegate 프로토콜의 메소드에 대한 추가 정보는 UIWebViewDelegate Protocol Reference 를 보라.
Keyboards and input Methods 키보드와 입력 메소드
텍스틀 입력을 받아 들일 수 있는 객체에 사용자 탭이 발생할 때마다, 객체는 적절한 키보드를 출력할 지를 시스템에 묻는다.
프로그램의 요구와사용자의 선택 언어에 따라, 시스템은 몇 가지 다른 종류의 키보드 중 하나를 출력할 것이다.
사용자의 선택 언어 (그리고 키보드 입력메소드)를 당신의 애플리케이션이 통제할 수는 없지만,
특수 키와 그 행동에 대한 설정같은 계획된 사용자를 지시하는 키보드의속성을 통제할 수 있다.
애플리케이션의 텍스트 객체를 통해 직접적으로 키보드 속성을 설정한다.
UITextField 와 UITextView 클래스 모두 UITextInputTraits 프로토콜을 따르며, 프로토콜은 키보드 설정을 위한
프로퍼티를 정의한다.
이 프러퍼티를 프로그래밍적으로 설정하거나, 인터페이스 빌더 인스펙터 윈도우에서 설정하면 시스템은 지정된
타입의 키보드를 출력할 것이다. (아항 Done 설정 등이 여기에 정의되어 있었군..)
주의 : UIWebView 클래스가 UITextInputTraits 프로토콜을 직접적으로 지원하지 않는다 할 지라도, 텍스트 입력
엘리먼트를 위한 몇가지 키보드 속성을 설정할 수 있다. 특히 다음 예에서 보여지는 것처럼 키보드의 행동을 특정하는데,
입력 엘리먼트의 정의내 autocorrect와 autocapitalization 속성을 포함할 수 있다.
<input type="text" size="30" autocorrect="off" autocapitalization="on">
참고 : autocorrect와 autocapitalization에 대해 알아보던 중 얻어 걸린 내용아이폰에서는 모든 텍스트 입력하는 부분에 들어가는 기본 기능들이 있다.
사파리 브라우져에서도 마찬가지로 동작을 하는데 , 이것들을 몇 가지 속성 값을 통해 설정할 수 있다.
그리고 input 태그에서 입력받는 텍스트 내용에 따라 그에 맞는 키보드 자판이 나와주기를 원할 수 있을텐데,
이것 또한 약간의 속성 지정으로 컨트롤 할 수 있다.
어플리케이션에서만 키보드를 선택 할 수 있는 것이 아니니 웹사이트에서 잘 사용하면, 사용자에게
편한 UI를 제공할 수 있다.
1. 영문 첫글자 대문자 모드 없애기
텍스트를 입력받는 <input type="text"> 태그가 있는 웹페이지를 아이폰 사파리로 들어가보면,
특정한 설정을 하지 않은 상태에서는 영문 키보드 상태가 첫 글자는 대문자로 쓰는 것이 기본으로
설정되어 있다.
로그인 아이디나 이메일을 입력하려는 곳에서 첫 글자가 의도하지 않게 자꾸 대문자로 쓰이면 짜증난다.
자동으로 첫 글자 대문자 모드로 되는 것을 막으려면 autocapitalize="off"를 사용하면 된다.
<input type="text" autocapitalize="off" />
2. 자동 완성 사용안하기
네이버 검색창에 검색어 입력 할 때 추천 검색어 같은 것을 보여주는 그런 기능을 넣는다면,
브라우져 자체에서 제공하는 자동 완성이 거슬리게 될 것이다.
이것을 끄려면 autocomplete="off" 를 사용하면 된다.
<input type="text" autocomplete="off"/>
3. 자동 교정 사용 안하기
아이폰에는 기본적으로, 텍스트 입력시 자동으로 오타를 수정해 주는 기능이 있다.
이것이 동작 안하도록 하고 싶은 경우도 있을텐데 이것은 autocorrect="off" 를 사용하면 된다.
<input type="text" autocorrect="off" />
4. 필요에 맞는 키보드 나오게 하기
전화번호 입력 키보드
<input type="tel" />
URL 입력 키보드
<input type="URL" />
Email 입력 키보드
<input type="email">
숫자 입력 키보드
<input type="text" pattern="[0-9]*" />
또는
<input type="number" />
'이동' 버튼을 '검색'으로 나오도록 할려면
<form><input type="search" /> </form>
또는
<form><input type="text" name="q_search" /> </form>
(name 속성값에 'search' 가 포함되도록 하면 됨)
여기까지 봤을때 사파리와 아이폰 OS는 HTML5의 기능을 많이 지원하는 것 같다.
HTML5 문법도 공부하도록 하자.
다시 본론으로 ...
입력 엘리먼트의 키보드 타입을 특정할 수는 없다.웹 뷰는 디폴트 키보드에 근거하여 커스텀 키보드를 표시하지만,
폼 엘리먼트 사이를 탐색하는 몇가지 추가적인 컨트롤을 포함한다.
디폴트 키보드 설정은 일반적인 텍스트 입력을 위해 설계되었다.
아래 그림과 같이 몇가지 다른 키보드 설정 중에서 디폴트 키보드를 표시한다.
디폴트 키보드는 초기에 알파벳 키보드를 출력하지만, 사용자는 토글하여, 숫자와 기호를 출력할 수 있다.
다른 키보드의 대부분은 디폴트 키보드와 비슷한 기능을 제공하지만, 특정 작업에 알맞는 추가 버튼을 제공한다.
전화 다이얼과 숫자 키보드는 숫자 입력을 지향하지만, 완전 다른 레이아웃을 제공한다.
각각 사용자의 언어 설정을 용이하게 하기 위해, 아이폰 OS는 다른 입력 메소드와 각각 언어에 따른 키보드
레이아웃을 지원하며, 그들 중 몇개를 아래그림에서 보여준다.
키보드를 위한 입력 메소드와 레이아웃은 사용자의 언어 설정에 따라 결정된다.
결국 키보드 사라지는 법을 알아내지 못하고 지쳐버렸다. 영어가 넘 약해서
그래서 다시 검색을 이용해 예제를 찾아냈다. 맞는지 모르겠지만 아직 시험전이다.
집에가면 함 시험해 봐야지
//view생성
UIView *contentView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
self.view = contentView;
[self.view addSubview:textview];
//textview 생성
UITextView *textview = [[UITextView alloc] initWithFrame:textfieldrect];
textview.text = @"test";
textview.delegate = (id)contentView; //델리게이션 설정
contentview에 implementation 할때
- (BOOL)textViewShouldBeginEditing:(UITextView *)textView
{
return NO;
}
아고공 혼자하는 건 힘들다.
'개발 > App Developer' 카테고리의 다른 글
10.07.08 스터디 (0) | 2010.08.31 |
---|---|
10.07.08 GDB 간단 명령어 및 breakpoint 사용법 (0) | 2010.08.31 |
스텍(Stack), PUSH, POP (0) | 2010.08.31 |
계산기 형변환에 관해서 읽어볼것 (0) | 2010.08.31 |
UITextView keyBoard (0) | 2010.08.31 |