0

詳細テキストを表示するために使用する UiTextView があります。テキストが長すぎてスクロールできない場合があります。UITextView のフレーム内に収まるほどテキストが短い場合があります。

また、長いテキスト文字列を検索するために使用できる検索機能も実装しています。この関数は、検索入力文字列に一致するテキストにフォントの色属性を追加します。この関数は、一致した検索文字列入力ごとに NSRange 値の配列を収集します。正規表現を使用して検索文字列を照合し、一致ごとに NSRange 値の配列を返します。

私は現在、一致した検索文字列の UITextView 位置にユーザーをアニメーション化する関数を開発しています。

後で、ユーザーがクリックして一致を循環できるボタンを提供します。

これまでのところ、すべてがうまく機能しています。以下のコードを参照してください。 detailTextは UITextView です。

    // rangeOfSearchText uses a regex to return the range of the match. For text purposes, the function returns the first index only. 

   let rangeOfMatch = rangeOfSearchText(searchString: self.searchText!, UIText: self.detailText.text)

   let glyRange =  self.detailText.layoutManager.glyphRange(forCharacterRange: rangeOfMatch, actualCharacterRange:nil)

   let rect =  self.detailText.layoutManager.lineFragmentRect(forGlyphAt: NSMaxRange(glyRange), effectiveRange: nil)
   self.detailText.scrollRectToVisible(rect, animated: true)

コードはうまく機能しますが、結果の UITextView フレームの下部に一致したテキストが表示されます。一致したテキストをビューの中央に表示したい。ちょっとうまくいく次のコードを試しました:

self.detailText.contentOffset.y = 200      

contentOffsetは、一致したテキスト範囲がより大きな複数行の文字列の中間にある場合にのみ、意図したとおりに機能します。一致したテキスト範囲が文字列の先頭にある場合、contentOffsetを実装すると、ユーザーは一致したテキストを 200 スクロールします。基本的に、一致したテキストはスクロールして見えなくなります。それはダメです。一致したテキストが複数行のテキストの末尾にある場合、contentOffsetはさらに空白を追加して、一致したテキストをビューの中央に配置します。どちらの結果も望ましくありません。私は後者を受け入れることができますが、前者は最初に一致したテキストをスクロールして見えなくなるため、良くありません。

スタック オーバーフローに関する同様の問題を検索しましたが、見つかりません。存在する場合は、親切に指摘してください。そうでない場合は、任意の提案を歓迎します。

4

1 に答える 1

0

これはうまくいくようです:

if rect.minY >= detailText.frame.height/2 {

self.detailText.scrollRectToVisible(rect.offsetBy(dx: 0.0, dy: detailText.frame.height/2), animated: true)

}

于 2019-03-25T02:40:30.363 に答える