問題タブ [core-text]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - iOS: Quartz を使用して文字列の幅と高さをどのように測定しますか?
質問する前に、これは Apple のドキュメント re: how to determine the width of a string using Quartz: からのものです。
アプリケーションにとってテキストの測定値が重要な場合は、Quartz 2D 関数を使用してそれらを計算することができます。とはいえ、文字のレイアウトや採寸に強みを持つATSUIをまずは検討してみてはいかがでしょうか。ATSUI には、テキスト メトリックを取得する関数がいくつかあります。レイアウト後のテキスト メトリックを取得できるだけでなく、必要に応じて、レイアウト前のテキスト メトリックを取得することもできます。自分で計算しなければならない Quartz とは異なり、ATSUI は測定値を計算します。たとえば、ATSUI 関数 ATSUMeasureTextImage を呼び出すことによって、テキストのイメージ境界四角形を取得できます。
Quartz のテキストが ATSUI (または Cocoa) よりもニーズに適していると判断した場合は、次の手順に従って、Quartz がテキストを描画する前にテキストの幅を測定できます。
- 関数 CGContextGetTextPosition を呼び出して、現在のテキスト位置を取得します。
- 関数 CGContextSetTextDrawingMode を使用して、テキスト描画モードを kCGTextInvisible に設定します。
- 関数 CGContextShowText を呼び出してテキストを描画し、現在のテキスト位置にテキストを描画します。
- 関数 CGContextGetTextPosition を呼び出して、最終的なテキスト位置を決定します。
- テキストの幅を決定するには、終了位置から開始位置を引きます。
ここに私の質問があります:
これは本当に Core Graphics を使用して文字列の幅を決定する最良の方法ですか? 私のテキストは 2D グラフィック要素と共存しているので、すべてのレンダリングに同じコンテキストを使用したいと考えています。次のようなコンパクトな方法があることを望んでいました。
/li>ATSUI は時代遅れで、Core Text に置き換わろうとしていると読みました。それは本当ですか?もしそうなら、それはiOSにありますか?
iphone - 下線/取り消し線付きのテキスト ( MULTILINE STRING ) を描画しますか?
すべてのタイプのテキスト配置で下線付きの複数行テキストを描画する必要があります。フォーラムで検索したところ、次のような結果が得られました。
http://davidjhinson.wordpress.com/2009/11/26/underline-text-on-the-iphone/
http://forums.macrumors.com/showthread.php?t=561572
ただし、すべて単一行のみのテキストを描画します。私は複数行のテキストを持っています。テキストの配置が中央揃えになると、状況はさらに悪化します。検索したところ、iphone-sdk-3.2 にはテキストに下線を引くためのコアテキスト属性がいくつかあることがわかりましたが、その使用方法がわかりません。さらに、これらを使用しても、問題は完全には解決されません。
取り消し線のテキストも描画する必要があるためです。
これについて考えている人は誰でも助けてください。
cocoa - Core Text を使用してファイルからフォント (TTF) をロードするにはどうすればよいですか?
OSX 10.6 より前は、ATSFontActivateFromFileSpecification/ATSFontActivateFromFileReference が利用可能で、ファイルからフォントをロードするために使用できました。Core Text で同様のものを見つけることができません。
cocoa - Core Text の CTFramesetterSuggestFrameSizeWithConstraints() が毎回間違ったサイズを返す
ドキュメントによると、CTFramesetterSuggestFrameSizeWithConstraints ()
「文字列範囲に必要なフレームサイズを決定します」。
残念ながら、この関数によって返されるサイズは決して正確ではありません。これが私がやっていることです:
返されるサイズは常に正しい幅が計算されますが、高さは常に予想よりわずかに短くなります。
これは、このメソッドを使用する正しい方法ですか?
Core Text をレイアウトする他の方法はありますか?
この方法で問題が発生するのは私だけではないようです。https://devforums.apple.com/message/181450を参照してください。
編集: を使用して Quartz で同じ文字列を測定しsizeWithFont:
、属性付き文字列と Quartz の両方に同じフォントを指定しました。私が受け取った測定値は次のとおりです。
コア テキスト: 133.569336 x 16.592285
クォーツ:135.000000×31.000000
cocoa - コアテキストでテキストの境界四角形を見つける
Core Text でテキスト行の境界を見つけようとしています。簡単にするために、単一の文字があると仮定します。現時点では、次の方法を使用しています。
ほとんどの場合は機能しますが、math italic d (Unicode: 0x1D451) や math italic q (Unicode: 0x1D45E) などの一部の文字では、幅が少し短くなります。
CTLineGetTypographicBounds()
またはを使用してみCTFramesetterSuggestFrameSizeWithConstraints
ましたが、どちらも役に立ちませんでした (グラフィックの幅ではなく、グリフの前進を使用して幅を見つけていると思います)。フォント自体が斜体ではないため、傾斜角を使用してこれを修正することもできません。 .
グリフに直接アクセスして を使用しようとしCTFontCreatePathForGlyph()
ましたが、CGGlyph と UniChar はどちらも 16 ビットであり、32 ビット文字が必要であるため失敗しました。
私が何か間違ったことをしているかどうかは誰にもわかりますか?もしそうなら、正しい方法は何ですか?
アップデート:
フォントの問題ではないことを確認するために、別のフォントを使用しました。この問題は、Arial Italic の ASCII 文字にも存在します。
アップデート:
以前の更新は無視してください。これ (Arial Italic の問題) は私自身のバグであることがわかりました。ただし、最初の問題はまだ残っています。
iphone - CoreText: 行間スペース
2 つの線の間のサイズを知るにはどうすればよいですか? CoreText API を使用しています。
iphone - iPhone OS 構文の強調表示 UITextField
私はアプリケーションに取り組んでおり、ユーザーが入力したテキストに構文の強調表示を適用したいと考えています。いろいろ調べてみたところ、iOS 3.2以降でできると言う人もいますが、投稿はNDAが解除される前のもののようです。これを行う方法について誰か提案がありますか?
うまく実装できれば、github でコードをリリースすることに興味があります。
ありがとう
fonts - 喜びと利益のためのOpenTypeフォント解析(これらの愚かなテーブルを理解している人はいますか?)
ですから、これは主に楽しみのためです。私はいくつかのフォントの中で自分の道を探し回っています。いくつか質問があります。誰かがこの種のことをした場合は、助けていただければ幸いです。
cmapテーブル
私がテストしているフォントには、さまざまな形式のcmapサブテーブルがいくつか含まれています。読むことはできますが、どちらを使うべきかわかりません。すなわち。最も適切なサブテーブルを選択するための戦略は何ですか?これも意味がありますか?
グリフテーブル
これは本当に私の頭を傷つけています。私はここにあるものを通ります。そのページの2番目の表を見ると、「n」endPtsOfContours、「n」命令、および「n」フラグがありますが、輪郭と同じ数のフラグがあるかどうかはわかりません(輪郭の数はわかっています)。私は持っています)。次に、さらに悪いことに..(楽しい!)xCoordsの配列とyCoordsの配列があります。これらの配列の長さは不確定であり、BYTEまたはSHORTのいずれかのデータが含まれている可能性がありますが、どちらかについては説明しません。
わかりました、これが命令とフラグの目的であると思いますが、おそらくお分かりのように、私はそれらに対処する方法を本当に知りません。座標データにアクセスするにはTrueTypeインタープリターが必要ですか?
iphone - iPad で長いドキュメントをレンダリングする
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のドキュメントは本当にひどいですか?
とにかく、助けてくれてありがとう!
iphone - コア テキスト: バックグラウンド スレッドでページをカウントする
Core Text を使用して iPhone 用のテキスト ビューアを作成しているとします。ユーザーが基本フォント サイズを変更するたびに、特定のフォント サイズで NSAttributedString 全体を表示するために必要なページ数 (固定サイズの CGRects) をカウントする必要があります。
そして、ユーザーが不必要なUIの遅れを経験しないように、これを別のNSOperationで行いたいと思います。
残念ながら、ページをカウントするには、非表示テキスト描画モードを使用してフレーム (CTFrameDraw) を描画し、CTFrameGetVisibleStringRange を使用して文字をカウントする必要があります。しかし、テキストを描画するには CGContext が必要です。そして、ここから問題が始まります...
UIGraphicsGetCurrentContext を呼び出すことで、drawRect で CGContext を取得できますが、この場合は次のようになります。
- performSelectorOnMainThread を使用して CGContext で動作するメソッドを呼び出す必要がありますよね?
- 他のスレッドは、このコンテキストを CFRetain する必要があります。drawRect メソッドの外で drawRect の CGContext を使用することは許容されますか?
他の解決策はありますか?ワーカー スレッドで別の CGContext を作成しますか? どのように?CGBitmapContext? ページが正しくカウントされるように、すべての条件 (わからない、解像度など) が drawRect の CGContext と同じであることを確認するにはどうすればよいですか?