web-dev-qa-db-ja.com

構文強調表示のあるUITextView

UITextView、具体的には構文の強調表示(および検出)で構文の強調表示を行う方法iPhoneObjective-C =?

これを行う方法についての私の考えのいくつか:

  • NSAttributedString。 iOS 3.2以降で利用可能になりました。しかし、どのようにしてNSAttributedStringをUITextViewに入れますか?
  • UIWebView。ユーザーが編集を終えたときにオーバーレイし、CSSスタイルシートでテキストに色を付けます。しかし、これをUIWebViewでどのように実行して、テキストを指定し、色を付けるのでしょうか。
39
Joshua

UPDATE:iOS 7およびTextKit以降、構文の強調表示はパイのように簡単になりました。 これ以上見てはいけません (私による)紹介。


編集可能なコンポーネントが必要だと仮定すると、あまり期待はありません。すべてをカバーすることを確認するために、簡単な概要を説明します。

  • UITextViewプレーンテキストのみ、(パブリック)の方法はありません。しかし、editable。何かを変更したり、ジオメトリを取得したりする機会はありません。内部的にWebビューを使用します。各段落は<div>、編集エンジンによって変更されます。そこでDOmを変更することもできますが、これはすべてプライベートAPIです。すべてプライベートなので、オプションはありません。
  • UIWebViewhtmlなので、スタイルを設定したり、画像を埋め込んだりすることができます。これは、前に述べたスリー20だと思います(調べずに) UIが使用します。問題:編集できません。それを回避する(パブリック)方法はありません。プライベートAPIや多くの頭痛の種なしに、選択を取得したり、DOMにアクセスしたりすることはできません。編集はUITextViewのように機能しますが、まったく新しいレベルの頭痛が必要です。それでも:プライベート。
  • CoreTextフレームワーク:iOS 3.2以降、非常に優れたレンダリングエンジン。しかし、それだけです。 NSAttributesStringsを直接レイアウトしてレンダリングできます。ただし、ユーザーの操作はありません。テキスト選択なし、テキスト入力なし、スペルチェックなし、置換なし、ハイライトなし、いいえいいえいいえいいえ。レンダリングするだけです。そして、長いテキストを持つ古いデバイスでそれを速くするためにかなりの作業。
  • UITextInputプロトコル:キーボードとの対話を許可し、テキスト入力を取得します。また、基本的なテキスト置換を備えています。問題:テキスト入力のみ、文書化が不十分。テキスト選択なし(上記を参照)。

だからここにいる。中央機能を欠く2つの完全に機能するコンポーネントと、ミッシングリンクを欠く2つの部分的なソリューション。ここに私が思いつくことができるすべての実行可能なアプローチがあります:

  • ユーザーにUITextViewのスタイルを解除して編集し、UIWebViewでスタイル設定されたコンテンツを表示してもらいます。後者の場合は、Three20を使用できます。
  • CoreTextUITextInputの間のミッシングリンクを構築します。これには、テキストの選択、ハイライト、背景色、テキストの保存と管理、効率、スペルチェックなどが含まれますが、これらに限定されません。これらの一部はシステムフレームワークによって提供されますが、まだ多くの統合が必要です。
  • バグを報告し、NiceパブリックAPIが来るのを待ちます(私の個人的なアプローチ)。
  • 説得AppleプライベートAPIを再度許可し、UItextViews DOMを台無しにする。

Omni Groupは2番目のアプローチをとり、編集可能なテキストビューを作成しました。 OmniUI フレームワークにあります。ただし、この実装は完全にはほど遠いものです。 (少なくとも数か月前に最後に確認したときです)。彼らは一生懸命努力しましたが、それでもユーザーとのやり取りでAppleの完璧さを達成することができませんでした。 Appleは、テキストの選択と編集を伴うUIインタラクションのみを実行することに少なくとも数年を費やしたに違いありません。自宅では何もする必要はありません。グループ。

このすべてに興味深い側面があります:iWork。 Appleは、プライベートAPIを使用しないと主張しています。しかし、テキストの選択はOSと非常に同じです。そのため、フレームワークソースをアプリにコピーしている必要があります。非常に正直なアプローチ;)

75
Max Seelemann

IOS 5以降、UIWebViewを使用してcontenteditable="true"そのdivで。これにより、UIWebViewがキーボードを開き、ユーザーが直接DOMにテキストを入力できるようになります。次に、構文の強調表示を行うWebアプリケーションを記述できます。カスタムURLを使用してCocoaアプリと通信できます。

私の唯一の問題は、あなたがスペルチェックを受けられないように見えることです。

12
mxcl

JTextView は、UITextViewテキストストアをサポートするNSAttributedStringの代替品です。リッチテキストを表示できますが、不完全です。

2
ma11hew28

まだ誰かがこれに対する完全な解決策を探しているなら、私はこれを提供する2つのライブラリを知っています:

  • Highlightr :A Swift構文の強調表示用ライブラリ、数百の言語をサポートしますが、JSをバックエンドとして使用します。ただし、ライブ編集には十分高速です。(免責事項:私はこのライブラリの作成者です)。
  • SyntaxKitSam Soffes によるネイティブソリューションですが、開発の初期段階です。今後、TextMate構文をサポートする予定です。これは、ライブラリが十分に成熟したときの方法です。
1
JP Illanes

構文検出についてはあまり知りませんが、同じUITextViewに複数のスタイルを設定する場合は、 Three 20 UI を確認する必要があります

これはあなたに関連する可能性のある別の質問です: Cocoaでソースコードの構文強調表示を実装する最良の方法は何ですか 。 MacなのかiPhoneなのかはわかりませんが、これとThree20を組み合わせればiPhoneでも使えると思います。幸運を

0
vodkhang