텍스트 변경→ NSTextStorage → NSLayoutManager → Generate glyphs → Position Glyphs → Draw Glyphs in View
이 방법으로는 커스텀 드로잉을 할 때 어디서 텍스트를 분리해야할 지 알기 어렵다. 예를 들어 아래 같은 걸 하고 싶다는 것이다.
새로운 렌더링 과정
NSTextElement(읽기 전용의 값 객체 기반, 추상객체): 텍스트 컨텐츠의 일부를 표현
NSTextContentManager(추상 객체): 텍스트 컨텐츠로부터 element를 제공한다.
실제 저장소의 wrapper 객체
커스텀 저장소를 구현하기 위해서는 서브클래싱해야 한다.
기본 구체 클래스는 NSTextContentStorage다. 기존 NSTextStorage를 저장소로 사용한다.
content를 변경하기 위해서는 Transaction 메소드로 변경 사항을 감싸야 한다. 이렇게 해야 TextKit2의 다른 부분들이 변경을 감지할 수 있다.
class NSTextContentManager {
func performEditingTransaction(_ transaction: () -> Void)
}
NSTextLayoutManager: 텍스트 레이아웃 프로세스를 조정한다.
NSTextLayoutFragment(읽기 전용의 값 객체 기반): 1개 이상의 TextElement의 레이아웃 정보
contiguous-layout은 텍스트가 다시 그려질 때, 무조건 처음부터 다시 레이아웃을 하므로, 텍스트가 커지면 성능 이슈가 생긴다.
noncontiguous-layout은 보이는 부분에 대해서만 레이아웃을 하므로, 성능 이슈가 덜하다.
TextKit2는 언제나 noncontiguous를 기본으로 한다.
TextKit1에서는 선택사항이였다. 그나마도 너무 심플해서 제대로 할 수 있는게 없었다
viewport: 현재 사용자에게 보이는 영역