UILabelのテキストの部分文字列のCGRectを見つけるにはどうしたらいいですか?
2023-08-06 06:44:40
質問
与えられた
NSRange
を見つけたい。
CGRect
の中に
UILabel
のグリフに対応する、その
NSRange
. 例えば、私が見つけたいのは
CGRect
という文の中にある、quot;dog" という単語を含む
トリックは
UILabel
が複数の行を持ち、テキストが本当に
attributedText
であるため、文字列の正確な位置を見つけるのは少し難しいです。
に書きたいメソッドは、私の場合
UILabel
サブクラスに書きたいメソッドは次のようになります。
- (CGRect)rectForSubstringWithRange:(NSRange)range;
詳細、興味のある方のために。
私の目標は、次のことができるようになることです。 UILabel の外観と位置を正確に再現した新しい UILabel を作成し、それをアニメートできるようにすることです。 残りの部分は理解できましたが、特にこの手順が今のところ私を妨げています。
これまで問題を解決するためにやったこと。
-
iOS 7 では、この問題を解決する Text Kit があるだろうと期待していましたが、私が見た Text Kit の例のほとんどは、この問題を解決するために
UITextView
とUITextField
よりも、むしろUILabel
. - 私は、この問題を解決することを約束する Stack Overflow の別の質問をここで見ましたが、受け入れられた回答は 2 年以上前のもので、コードは属性付きのテキストでうまく実行されません。
これに対する正しい答えは、次のいずれかを含んでいることに賭けます。
-
Text Kit の標準的なメソッドを使用して、1 行のコードでこの問題を解決する。きっと、それには
NSLayoutManager
とtextContainerForGlyphAtIndex:effectiveRange
- UILabel を行に分割し、行内のグリフの rect を見つける複雑なメソッドを書くことで、おそらく Core Text のメソッドを使用します。私の現在の最善の策は @mattt の 優れた TTTAttributedLabel には、ある点でのグリフを見つけるメソッドがあります。これを反転して、グリフの点を見つければ、うまくいくかもしれません。
更新: この問題を解決するためにこれまで試した 3 つのことを github gist にまとめました。 https://gist.github.com/bryanjclark/7036101
どのように解決するのですか?
次のように ジョシュアさんの回答 をコード化すると、次のようになり、うまくいくようです。
- (CGRect)boundingRectForCharacterRange:(NSRange)range
{
NSTextStorage *textStorage = [[NSTextStorage alloc] initWithAttributedString:[self attributedText]];
NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init];
[textStorage addLayoutManager:layoutManager];
NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:[self bounds].size];
textContainer.lineFragmentPadding = 0;
[layoutManager addTextContainer:textContainer];
NSRange glyphRange;
// Convert the range for glyphs.
[layoutManager characterRangeForGlyphRange:range actualGlyphRange:&glyphRange];
return [layoutManager boundingRectForGlyphRange:glyphRange inTextContainer:textContainer];
}
関連
-
[解決済み] UILabel 内のテキストを縦に上部に揃える
-
EXC_BAD_ACCESS (code=2, address=0x0)
-
[解決済み] キーボードがあるときに、UITextFieldを編集開始時に上に移動させるには?
-
[解決済み] UITableViewの選択を無効にするにはどうすればよいですか?
-
[解決済み] iOSのステータスバーの文字色を変更する方法
-
[解決済み] 制約条件の変更をアニメーションで表現するには?
-
[解決済み] iOS 13 のフルスクリーンでモーダルを表示する
-
[解決済み] UILabelで複数行のテキストを表示する
-
[解決済み] NSNotificationCenterのaddObserver in Swift
-
[解決済み】テキストに応じてUILabelの高さを調整する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] アトミック属性と非アトミック属性の違いは何ですか?
-
[解決済み] performSelectorのセレクタが不明なため、リークが発生する可能性があります。
-
[解決済み] UITableViewの下にある余分なセパレータをなくす
-
[解決済み] テキストフィールドを移動する方法(次へボタン/完了ボタン)
-
[解決済み] Swiftを使用してアプリのバージョンとビルド番号を取得するにはどうすればよいですか?
-
[解決済み] UITextFieldの最大文字数を設定します。
-
[解決済み] NSOperationとGrand Central Dispatchの比較
-
[解決済み] iOSで現在のデバイスの言語を取得するには?
-
[解決済み] Swiftの配列を文字列に変換するには?
-
[解決済み] UITextBorderStyleNoneを使用してUITextFieldのパディングを設定する