NSAttributedString と TextKit

Presenter Notes

自己紹介

アイコン

Presenter Notes

What is NSAttributedString?

Session_222_-_Introduction_to_Attributed_Strings_for_iOS

via Session 222 Introduction to Attributed Strings for iOS

  • 文字列をNSRangeで切って装飾できるクラス
  • Cocoaには結構前からある

Presenter Notes

Style Attribute

* NSBackgroundColorAttributeName 背景色
* NSFontAttributeName フォント名
* NSForegroundColorAttributeName 文字色
* NSKernAttributeName カーニング
* NSLigatureAttributeName リガチャ(合字)
* NSParagraphStyleAttributeName - NSParagraphStyle
* NSShadowAttributeName 影 NSShadowを使う
* NSStrikethroughStyleAttributeName 打ち消し線
* NSStrokeColorAttributeName 袋文字(中抜き文字)
    * NSStrokeWidthAttributeName 
* NSUnderlineStyleAttributeName アンダーライン"

ref.

Presenter Notes

NSParagraphStyle

  • lineSpacing
  • paragraphSpacing
  • paragraphSpacingBefore
  • alignment
  • lineBreakMode

lineHeght

Presenter Notes

Layout

Presenter Notes

Interface Builder

layout

Presenter Notes

layout

Presenter Notes

HTML Rendering?

Presenter Notes

DEMO

Markdown Syntax highlighting
azu/MarkdownSyntaxEditor

Presenter Notes

そしてTextKitへ

Presenter Notes

TextKit

iOS6 Architecture

iOS6 Architecture

via Text Kit Tutorial | Ray Wenderlich

Presenter Notes

iOS7 Architecture

iOS7 Architecture

  • UI テキスト系の描画に使われてる仕組みが変わった
  • Mac から Port

Presenter Notes

レンダリングの仕組み変更

  • iOS7 から UILabl/UITextField/UITextViewは TextKit
  • UIWebViewのみが Webkit

iOS6

iOS7

Presenter Notes

NSTextStorage

  • @interface NSTextStorage : NSMutableAttributedString
    • Available iOS7~
  • NSTextStorageは文字とAttributesをASTとして保持してる
    • MVCでいうならModel
  • NSAttributedStringのサブクラス

Presenter Notes

Text Kit Objects

  • NSTextStorage - テキストを保持。変更をNSLayoutManagerに通知
  • NSLayoutManager - 中央で通知の管理など、glyphsを生成しContainerに描画できるか聞く
    • NSTextStrorage <- NSLayoutManager -> NSTextContainer
  • NSTextContainer - テキストが書かれる領域を管理するクラス(円形にするとかも出来る)
  • UITextView - よくみる子

NSTextStrorage Architecture

Presenter Notes

Mac Cocoaとの違い?

  • UITextView <-> NSTextView
  • NSTypesetter , NSGlyphGenerator はiOSにない
    • NSLayoutManager にマージされてる
  • 細かな違いはあるが基本的に同じ
  • なぜ今さら TextKit がiOSにきたのか

=> 理由はシンプル

Presenter Notes

パフォーマンス

  • NSTextContainer で領域を可変に出来るということ
    • => reflowが大量に発生するということ
  • 自由度が増える
    • 使用するメモリや計算量が増える

Presenter Notes

より詳細な管理

  • begin/endで明示的な変更を通知できるのでより効率的に処理できる
- (void)beginEditing;
- (void)endEditing;

Presenter Notes

  • 上にベースとなるUITextView(NSTextStorageもViewから)
  • 下に2枚のUITextViewと対となるNSTextContainerが2つ

gif

Presenter Notes

NSTextContainer multi

Presenter Notes

一つのデータで複数の描画

  • NSLayoutManager は 上下1枚づつで2枚ある
    • それぞれが参照する NSTextStorage は同じもの
    • つまり、NSTextStorageを変更すれば、上下のViewに入るテキストも同時に変わる
  • 1つのテキストデータを使って、複数のUITextViewに対して描画を行える
    • 描画するの領域は NSTextContainer で決定出来る
  • CSS Regionsと似た感じ

Presenter Notes

NSTextContainerのexclusionPaths

NSTextContainer

Presenter Notes