私はUITextView
に常に同じ固定高さにキャレットを保持するようにしようとしています(例えば、画面の1/4に)。タイプライターエフェクトを作成するには、UITextViewでキャレットの位置をロックする方法はありますか?
私は古いタイプライターと同じように動作するはずです。ユーザーがenter(またはend of line)を押すと、テキストは1行上にスクロールし、キャレットは同じyの位置に留まり、新しい行の先頭にジャンプします。
私はそれをそうしようとしていましたが、予期しない動作をしました。キャレットは時々ランダムにジャンプし、スクロールが表示され、スクロールしてからscrollRectToVisible
でスクロールします。それ。
どうすればこのような効果を得ることができますか?同様の機能を備えたライブラリやポッドも高く評価されます。ここで
func setScrollToMiddle() {
if let selectedRange = textView.selectedTextRange {
let caretRect = textView.caretRect(for: selectedRange.start)
let middleOfCaretHeight = caretRect.origin.y + (caretRect.height/2)
let screenHeight = UIScreen.main.bounds.height
guard let kbSize = self.keyboardSize else { return }
let keyboardHeight = kbSize.height
let visibleTextAreaHeight = screenHeight - keyboardHeight - topMenuView.frame.height
let finalRectY = middleOfCaretHeight - topMenuView.frame.height - (visibleTextAreaHeight/2)
let finalRect = CGRect(x: 0.0, y: finalRectY, width: textView.frame.width, height: visibleTextAreaHeight)
textView.scrollRectToVisible(finalRect, animated: false)
}
}
私は意図した効果を理解するのに苦労しています。あなたのコードでは、画面の測定をたくさん行っているようです。それはいいですが、あなたはどのような進歩を遂げましたか?あなたが持っているコードはどうなっていますか?何が起こると予想されていますか、そして実際には何が起こっていますか? –
'UITextView'を' UIScrollView'にラップして実装します。 – kelin
@kelin UIScrollViewでラップする必要はありません.UITextFieldクラスの定義を確認すると、実際には既にUIScrollViewのサブクラスが表示されます。 –