- Text Effects
- NSAttributedString API를 통해서 새로운 Text Effect 추가
- Swift에서는 NSAttributedStyle.TextEffectStyle
- Main Text Kit objects
- NSTextStorage
- 텍스트 뷰의 backing store
- NSMutableAttributedString의 서브 클래스로, AttributedString에서 쓰던 테크닉을 그대로 사용 가능
- NSLayoutManager
- text와 attribute를 glyph로 바꾸는 역할
- delegate를 통해서 중간 과정에 개입 가능
- NSTextContainer
- 텍스트가 그려질 구역을 정의한다.
- exclusionPath 등을 가진다.
- 기본적으로 1대 1대 1이지만, 다양한 설정을 가질 수 있다. -> 멀티페이징
- 2개 이상의 TextContainer
- 2개 이상의 TextContainer와 LayoutManager
- Text layout explained
- NSLayoutManager
- 텍스트 레이아웃의 컨트롤러 역할
- 모든 텍스트 레이아웃 정보는 접근 가능하다.
- 서브클래싱과 델리게이션을 통해서 확장 가능
- 텍스트 레이아웃 = Glyph + Location
- Glyph: 1개이상의 캐릭터에 대한 그래픽적 표현
- Graphics system에서의 Glyph ID는 CGGlyph로 표현된다.
- Working with Layout Information
- 글리프 수준에서의 텍스트 크기 변경
- 히트 테스트
- 글리프의 정확한 위치 쿼리
- 커스텀 렌더링
- API
- 글리프 인덱스
- 글자 단위 인덱스가 아님에 주의
- 이는 이합자, 말줄임, 하이픈 등의 텍스트로는 나타나지 않는 예외들이 있기 때문
- 그 대신에 character 인덱스와 glyph 인덱스는 개별적으로나 범위로나 상호 전환이 가능하다.
- range 같은 경우는 glyph와 character가 1대 1 대응이 아닐 수 있기 때문에 요청한 범위와, 실제 대응되는 범위가 다를 수 있어 포인터 하나를 인자로 받는다.
- 텍스트 컨테이너
- 인덱스로 지정된 글리프가 속한 텍스트 컨테이너를 받아올 수 있다.
- 라인
- 인덱스로 지정된 글리프가 속한 라인 프레그먼트를 받아올 수 있음
- 글리프 위치
- 인덱스로 지정된 글리프의 실제 위치를 받아올 수 있음.
- 히트 테스트
- 수동 드로잉
- 텍스트 레이아웃 좌표계
- 뷰와 동일함: 좌상단부터 시작함
- 컨테이너, 라인 프래그먼트 개별적으로 CGRect로 나타남
- Customizing Text Layouts
- line spacing 변경 -> paragraph 객체를 통해서 글자 단위로 명시해도 되지만
- 라인 브레이크 커스텀
- 커스텀 글리프 매핑
truncatedGlyphRange(inLineFragmentForGlyphAt glyphIndex: Int) -> NSRange
- 추가적으로 말줄임을 해야될 범위를 체크한 뒤에 재레이아웃
- glyph를 만들 때 커스텀으로 말 줄임
optional func layoutManager(_ layoutManager: NSLayoutManager ,
shouldGenerateGlyphs glyphs: UnsafePointer < CGGlyph >,
properties props: UnsafePointer < NSLayoutManager . GlyphProperty >,
characterIndexes charIndexes: UnsafePointer < Int >,
font aFont: UIFont ,
forGlyphRange glyphRange: NSRange ) -> Int
- NSTextAtttachment, NSTextContainer 서브 클래싱