WWDC22:iOS 16、macOS Ventura、テキストレイアウトエンジン「TextKit 2」に完全移行
※本サイトは、アフィリエイト広告および広告による収益を得て運営しています。購入により売上の一部が本サイトに還元されることがあります。
Appleが、WWDC22において、テキストビューの最新のアップデートを紹介する「What's new in TextKit and text views」を公開しています。
iOS 15とmacOS Montereyでは、パフォーマンス、正確性、安全性を向上させたパワフルな新しいテキストエンジン「TextKit 2」が導入されました。
TextKit 2のビューポートベースのレイアウトアーキテクチャは、特に大きな内容を持つドキュメントに対して、高いパフォーマンスのテキストレイアウトを実現します。
TextKit 2は、グリフを扱う際の不必要な複雑さを取り除くことで、国際的な読者に対してより良いテキスト体験を提供し、OpenTypeや可変フォントなどの最新のフォント技術に完全対応しています。
また、TextKit 2は、テキストのレイアウトを制御するための上位レベルのオブジェクトとの連携に重点を置いているため、テキストのレイアウトのカスタマイズが容易になり、より少ないコードでよりクールなものを構築できるようになりました。
今後、TextKit 2エンジンは、Appleのすべてのプラットフォームにおけるテキストレイアウトとレンダリングの基礎を形成します。
iOS 16とmacOS Venturaでは、UITextViewを含むUIKitとAppKitのすべてのテキストコントロールはTextKit 2を使っています。
つまり、システム全体でレイアウトとレンダリングにTextKit 2を使用しているため、すべてのアプリができるだけ早くTextKit 2に移行することが重要であり、私たちは移行を容易にするためのツールを多数追加しました。
多くのアプリにとって、これはゼロコードでの移行となりえ、また、テキストビューに特別な変更を加えないアプリについては、そうなることが予想されます。
TextKit 2がUIKitに初めて登場したのはiOS 15で、そこでUITextFieldがアップグレードされてTextKit 2を使うようになりました。
iOS 16では、UIKitのTextKit 2への移行が完了し、UITextViewを含むすべてのテキストコントロールがデフォルトでTextKit 2を使用するようになりました。
ほとんどのテキストビューは自動的にTextKit 2にオプトインされ、デベロッパー側で採用する必要はありません。
ただ、いくつかの状況によっては、テキストビューがオプトインされないことがあります。
AppKitについても同じようなことが言え、TextKit 2は、macOS Big Surで初めてAppKitに搭載されました。
macOS Montereyでは、NSTextFieldがアップグレードされてデフォルトで使用できるようになり、NSTextViewでもオプトインすることで使用できるようになりました。
macOS Venturaでは、すべてのテキストコントロールがデフォルトでTextKit 2を使用します。UITextViewと同様に、ほとんどのNSTextViewは自動的にTextKit 2にオプトインされ、あなたの側で採用する必要はありません。
NSTextViewの薄いラッパーであるTextEditは、macOS VenturaではどこでもTextKit 2を使用しています。
テキストエディットはmacOS Big Sur以来、プレーンテキストモードでTextKit 2を使用しています。
macOS Venturaでは、リッチテキストモードでもTextKit 2を使用しています。
Interface Builderで作成されたテキストビューには、新しいテキストレイアウトオプションが追加されました。
この新しいオプションは、インスタンスごとに使用するレイアウトシステムをコントロールすることができます。
デフォルトの設定は、システムのデフォルトであるTextKit 2です。
また、TextKit 2またはTextKit 1を明示的に使用するように選択することもできます。
TextKit 2 は、非単純なテキストコンテナに対応しました。非単純なテキストコンテナには、穴や隙間がある場合があります。
これにより、テキストが画像や他のインライン・コンテンツの周囲に回り込むことができます。
非単純なテキストコンテナを作成するには、NSTextContainer の exclusionPaths プロパティを使用して、テキストをレイアウトしてはならない領域を定義します。
TextKit 2の改行エンジンが強化され、両端揃えの段落に対してより均等な改行が選択できるようになりました。
この微妙な変更は、長い段落のテキストでよりわかりやすくなっています。
ここでは、同じテキストを同じエリアに2種類並べてみました。
従来の改行では、行が引き伸ばされ、文字間が大きく開いていることに注目してください。
新しい均等な改行では、このような現象が大幅に減少しています。これによってテキストは読みやすくなります。
TextKit 2 のすべてのプラットフォームで、テキストリストがサポートされるようになりました。
テキストリストでは、プログラムによって番号付きリストや箇条書きリストを作成し、テキストビューに表示させることができます。
TextKit 2 では、TextKit 1 と同様、NSTextList を使ってテキストリストを表現します。
NSTextList は AppKit でのみ利用可能でしたが、iOS 16 では UIKit でも利用できるようになりました。
TextKit 2のテキスト添付TextKitAndTextView APIでは、UIやNSViewをテキスト添付ファイルとして使用でき、イベントは添付ファイルビューで直接処理することができます。
これにより、テキストアタッチメントのイベント処理が非常に簡単になり、TextKit 2でしかできないことです。
NSLayoutManager のグリフベースの API は、連続した範囲の文字と連続した範囲のグリフを直接関連付けることができると仮定していますが、それはすべてのスクリプトで正しいわけではありません。
これらの API を使用すると、カンナダ語のようなスクリプトで書かれたテキストのレイアウトやレンダリングが崩れてしまうことがあります。
そのため、TextKit 2 ではグリフ API がゼロになっています。1つの TextKit 2 API を TextKit 1 のグリフ API で置き換えることはできません。
これらのAPIを置き換えるには、別のアプローチが必要です。