7

iPad でカスタム ドキュメント形式の強調表示/注釈機能を備えたドキュメント ビューアーを実装しています。ドキュメントはやや長く (紙に印刷すると 100 ~ 200 ページ)、適切なアプローチを見つけるのに苦労しました。要件は次のとおりです。

1) 基本的なリッチ テキスト スタイル: 左/右マージンの制御。フォント名、サイズ、前景色/背景色、および行間を制御します。太字、斜体、下線など

2) 任意のテキスト領域の選択と強調表示 (Safari/UIWebView のような段落境界に限定されません)。

3) 切り取り/コピー/貼り付けポップアップ (UIMenuController) のカスタマイズ これは、アプリの必須要件の 1 つです。

私の最初の実装は UIWebView に基づいていました。テキスト スタイル設定用の CSS を使用して、ドキュメントを HTML としてレンダリングしました。しかし、(段落の境界を越えて) 必要な種類のテキスト選択動作を得ることができず、UIMenuController を UIWebView 内からカスタマイズすることはできません。

そこで私は、JavaScript のアプローチに取り組み始めました。JQuery を使用してデバイスのテキスト選択動作を偽造し、タッチ イベントをトラップし、DOM を動的に変更してテキストの選択領域の背景色を変更しました。偽の UIMenuController コントロールを非表示の DIV として作成し、アクティブな選択領域があるたびに配置して再表示しました。

汚すぎる格好はやめて。

主な問題は、それが SLOOOOOOOW だということです。ドキュメントをスクロールするのは素晴らしく速いですが、動的に DOM を変更するのはあまり機敏ではありません。さらに、拡大鏡ルーペを再作成する方法がわからなかったため、偽のテキスト選択 GUI はネイティブ実装とまったく同じには見えません。また、JavaScript レイヤーと Objective-C レイヤー (アプリの残りの部分が存在する) の間の通信ブリッジをまだ実装していませんが、これは非常に面倒なことになりつつありました。

だから私はCoreTextを見てきましたが、Web上には貴重な例がほとんどありません. この単純な小さなデモに少し時間を費やしました。

http://github.com/jonasschnelli/I7CoreTextExample/

CoreText を使用して NSAttributedText 文字列を UIView に描画する方法を示します。しかし、独自の問題があります。テキスト選択動作を実装しておらず、UIMenuController を提示していないため、それを実現する方法がわかりません。さらに重要なことに、ドキュメント全体を一度に描画しようとするため、長いドキュメントではパフォーマンスが大幅に低下します。ドキュメントには何千もの段落が含まれる場合があり、一度に画面に表示されるのはドキュメントの 1% 未満です。

プラス面として、これらのドキュメントにはすでに正確な書式設定情報が含まれています。テキストのすべての行の正確なページ位置を知っているので、レイアウト エンジンは必要ありません。

CoreText を使用してこの種のビューを実装する方法を知っている人はいますか? このような質問に対して本格的な実装はやり過ぎであることは理解していますが、いくつかの基本的な要件を備えた優れた CoreText の例を探しています。

1) 正確なレイアウトと書式制御 (計算済みの書式メトリックとテキスト スタイルを使用)。

2) テキストの任意選択。

3) UIMenuController のカスタマイズ。

4) オフスクリーン オブジェクトのリソースの効率的なリサイクル。

テキスト要素が画面外にスクロールしたときに独自のリサイクルを実装できれば幸いですが、UIScrollView を再実装する必要はありませんか?

私は iPhone 開発の初心者で、まだ Objective-C に慣れていますが、他の言語 (Java、C#、flex/actionscript など) で 10 年以上働いているので、自信を持っています。 iPhone SDK と、このようなものの一般的なコーディング パターンについてより良い感触があれば、仕事を成し遂げる私の能力。それは私だけですか、それともSDKのドキュメントは本当にひどいですか?

とにかく、助けてくれてありがとう!

4

4 に答える 4

2

あなたの文書には、各段落以外のセマンティック コンポーネントがありますか? セクションまたはページの概念がすでにある場合は、それぞれを独立したテーブルセルとしてレンダリングすることをお勧めします。実際に UITableView を見ていることを忘れさせるテーブルセルを作成するのは非常に簡単です。drawRect: と setSelected: と setHighlighted: をオーバーライドするだけです。もうセルディバイダーはありませんあなたがそれらを望まない限り。さらに、テーブルビューをベースとして使用することで、いくつかの気の利いたことができます。UITableView でセクションを定義すると、ドキュメントをページングするときにスクロールする気の利いたヘッダーを作成できます。もう 1 つの方法は、「セクションへジャンプ」バー / ブックマーク メニューを追加することです。そうすれば、セクションの境界を越えて選択する必要がなくなります。

大量のコピー ペースト ブロックは、システムにとっても非常に苦痛です。さらに、このコンテンツを提供するのに苦労した場合、誰かが一度にすべてを簡単にコピーできるようにしたくない場合があります... (プロジェクトの詳細がなければ、この考え方に従うことはできません)。

本当にコピー ペースト オプションを提供したい場合は、各論理ページまたはセクションにボタンを追加して、ユーザーの利便性のためにセクション全体をすぐに選択してコピーすることができます。(たぶん、引用が関連付けられていますか?)

この提案を使用することを選択した場合、これらのページが非常に役立つため、SDK ドキュメントで UITableViewCell UITableViewDelegate と UITableViewDataSource を検索することをお勧めします。

于 2010-06-14T07:40:58.570 に答える
1

2つのランダムな観察:

  • ページング インターフェイスを作成する余裕はありますか? (「エンドレス スクロール」とは対照的に。) システム リソースに関しては、ページング インターフェイスの方がはるかに簡単なようです。

  • UIActionBar実際にはUIMenuControllerクラスです。メニューがシングルトン (wtf?) であるため、インターフェイスは少し奇妙ですが、問題なく理解できると思います。

それが役立つことを願っています。

于 2010-06-13T19:04:08.093 に答える
1

これが潜在的な解決策ですが、それがクレイジーかどうかはわかりません。私はまだ iPhone の開発にとても慣れていないので、これは大したことではないかもしれません。

とにかく、ドキュメントの各段落 (サイズは既に正確に計算済み) を UITableView のセルとしてレンダリングするというアイデアがありました。UITableView には既にセル リサイクルのメカニズムがあるため、それをゼロから実装する必要はなく、リソース消費の問題を引き起こさずにドキュメントを任意に長くすることができます。

もちろん、UI をテーブルではなくドキュメントのように見せたいので、セル間の行セパレーターを取り除きたいと思います。

または、ドキュメントの各ページ (典型的な PDF のように、これはページ形式のドキュメント形式です) を表のセルとしてレンダリングし、セル区切りのグラフィックを上書きしてページ境界のように見せることもできます...

しかし、テーブル内のデフォルトのタッチ動作を取り除き、代わりにテーブル セルの内容にテキスト選択を実装することは可能でしょうか? 段落の境界 (複数のテーブル セル間) を超えるテキスト選択を実装することは完全に不可能でしょうか?

于 2010-06-13T22:33:01.030 に答える
0

UIWebView は良い選択ですが、各フォントと各スタイル シートを使用して正確にページを事前にレンダリングし、レンダリング情報をデータベース テーブルに保存するには、別のアプリケーションが必要です。

chapter_id int 主キー、開始位置 int

終了位置 int、
fontsize int (または stylesheetname 文字列)

JavaScript を使用すると、スクロールせずに div に収まる単語数を計算できます。

UIWebView豊富なコンテンツを提供し、選択と強調表示の動作があるため、優れています。

お役に立てれば。

于 2010-08-24T19:56:52.907 に答える