- Motivation
- 이전에는 String Drawing이 CoreGraphic위에 올라가 있었고 , Core Text와 같은 위치에 있었다.
- Core Text는 마스터 하는게 너무나도 어렵다 -> 거의 통과의례 급
- 렌더링 하는데 Core Text까지 파고 드는 건 너무 과하다.
- UIWebView도 Core Text를 썼는데, 스크롤 안에서 오작동 했다.
- Text Kit의 등장
- 빠른 모던 텍스트 레이아웃 및 렌더링 엔진
- Core Text 기반
- UIKit과 잘 녹아듬
- 이제 드로잉을 책임지는 것은 Text Kit이다. -> UIKit의 1급 시민
- UI 요소에서의 텍스트 드로잉을 모두 담당한다.
- UITextView, UITextField, UILabel은 Text Kit기반으로 재작성되었다.
- 애니메이션과 콜렉션뷰, 테이블뷰와도 잘 작동한다.
- OOP 기반으로 사용 가능 -> Core Text는 C 기반이라…
- TextKit 살펴보기
- TextKit으로 가능한 것
- 페이징 된 레이아웃
- 다단
- 텍스트 래핑
- rich text 편집
- 텍스트 폴딩
- 커스텀 truncation
- Dynamic Type 지원
- Font descriptor
- 폰트를 직접 만들지 않아도 된다.
- 아카이빙 가능
- Symbolic trait
- 라인 스페이싱
- CSS지원 추가
- UITextView의 구성
- NSTextContainer - layoutManager를 위한 좌표계와 영역을 정의한다.
- Exclusion Path 지정으로 포함되지 않는 영역을 뺀다.
- Hit-Test도 여기서 정의한 영역에서 진행된다. -> 터치 포인트에서 가가장 가까운 글자를 반환하는 것
- 특정 글리프가 텍스트에서 어떤 범위인지를 알기 위한 메소드 존재
- NSLayoutManager
- NSTextStorage
- 링크 지원
- 데이터 감지 - 텍스트에서 패턴이 감지되면, 적절한 앱으로 연결 가능
- Text Attachment
- 인라인 이미지에 주로 사용
- 텍스트 레이아웃에 영향을 미침
- 인터렉션 자동 지원
- Glyph
- 글자를 표현하는 그래픽 요소
- 캐릭터와 1대1매칭은 아니다.(ligature라는 예외가 있다.
- Text Kit Design - Layout and positioning
- 디테일한 디자인이 필요하다면 font mentric을 반드시 고려해야 된다.
- line height: ascender + descender
- capHeight: capital 기준선에서 baseline까지의 거리
- leading: 텍스트 라인 사이의 공간
- UIContentSizeCategoryDidChangeNotification을 감사함으로 dynamic type에 대응할 수 있다.
- intrinsic content size을 무효화 한다(오토레이아웃 기반)
- setNeedsLayout()을 사용한다(수동 레이아웃)
- 캐싱된 preffered font와 font descriptor는 무효화시킨다.
- 폰트를 바꿔주고, 텍스트뷰를 갱신한다.
- Intreractive rich text update
- iOS 6에서 attributedText 프로퍼티 추가
- iOS 7에서 textStorage에 직접 접근 가능 - 그 자리에서 변경 가능
- 텍스트 업데이트에 선택적으로 대응 가능
- textStorage에 대한 batch update
- beginEditing - endEditing
- endEditing이 되면 layoutManager가 레이아웃을 다시 잡음
- NSTextStorage의 서브클래싱 -> 편집 내용을 검사해서 동적으로 attribute를 바꿔주는 등의 동작읋 할 수 있다.
- 오버라이드 할 메소드
- 쿼리 메소드
- string
- attributesAtIndex: effectiveRange:
- 편집 메소드
- replaceCharactersInRange: withString:
- setAttributes: range: