Hulu のエンジニアがまさにそれを行う iOS ライブラリを作成したことを知り、うれしく思いました。それはGSFancyTextと呼ばれます。
彼ら自身の言葉で:
もちろん、 HTML を a で直接使用しUIWebView
たり、 を使用したりするなど、他のオプションも検討しましたNSAttributedString
。しかし、次の利点があるため、独自のスタイル/マークアップ解析およびリッチテキスト描画システムを作成することにしました。
- sよりも高速で、メモリ消費量が少なくなります
UIWebView
。
- スタイルと解析結果をさまざまな場所で再利用できます。
- 段落の小さな部分のスタイルやテキストを簡単に変更できます。
- Quartz 2D 機能、アニメーション、ジェスチャーなど、より凝った機能でシステムを拡張できる可能性があります。
- ローカライズが簡単になります。たとえば、太字でマークされた語句は、日本語の文では別の位置にある可能性があります。この場合、シングルを使用して
NSLocalizableString
、さまざまなスタイルの文を表すことができます。
- プレーン テキストを抽出するのは簡単で、VoiceOver サポートを有効にすることができます。
このライブラリは素晴らしいので、MonoTouch バインディングを作成しました。
例
まず、CSS のような文字列を使用してスタイルを定義します。
var stylesheet = @"
.green { color: #00ff00; font-weight:bold }
.gray { color: gray; font-weight:bold }
";
GSFancyText.ParseStyleAndSetGlobal (stylesheet);
次にGSFancyText
、マークアップ文字列を使用してオブジェクトを作成します。
var fancyText = new GSFancyText ("<span class=green>Hulu</span> <span class=gray>Plus</span>");
次に、カスタマイズされたビューでこれを直接描画できます。
fancyText.drawInRect (rect);
または GSFancyTextView オブジェクトを作成して表示します
var fancyView = new GSFancyTextView (frame, fancyText);
その他の例については、GSFancyTextView のドキュメントを参照してください。
私のお気に入りの機能は、疑似要素をレンダリングするために呼び出されるデリゲートを指定できるラムダ ブロックです<lambda id=yourhandler width=50 height=50>
。
これにより、カスタム イメージを挿入したり、高度なインライン描画を自分で行うことができます。