3

いくつかの単語が太字で、パディングが異なるいくつかの段落で構成され、リソースからの小さなインライン画像 (アイコンや箇条書きなど) を含むラベルを描画する必要があります。

太字と斜体に使用できることはわかってNSAttributedStringいますが、段落余白や行制限はサポートされていません。サーバーからスタイルを取得しているため、HTML/CSS のようなソリューションを使用したいと考えています。また、カスタム フォントでラップせずにカスタム イメージをテキストに挿入することもできません。

最後に、パフォーマンス上の理由から使用したくありません。 これを実現するために、どの MonoTouch ライブラリまたはバインディングを使用できますか?UIWebView

4

1 に答える 1

3

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>

これにより、カスタム イメージを挿入したり、高度なインライン描画を自分で行うことができます。

于 2013-01-28T21:56:08.157 に答える