gpt4 book ai didi

ios - 如何锁定 UITextView 中的插入符号 y 位置以创建打字机效果?

转载 作者:可可西里 更新时间:2023-11-01 00:56:15 28 4
gpt4 key购买 nike

我试图强制 UITextView 将插入符始终保持在相同的固定高度,例如在屏幕的 1/4 处。

我的行为应该类似于旧打字机 - 当用户按下回车键(或到达行尾)时,文本应该向上滚动一行,插入符号应该保持在相同的 y 位置并跳转到新行的开头。

我试图这样做,但它的行为出乎意料,插入符号有时会随机跳跃并且滚动可见,它向下滚动然后我再次使用 scrollRectToVisible 向上滚动,这不似乎是理想的实现方式。

我怎样才能达到这样的效果?任何具有类似功能的库或 pod 也将不胜感激。

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)
}
}

最佳答案

这是我会做的:

首先在viewDid load中设置这些

override func viewDidLoad() {
super.viewDidLoad()
textView.delegate = self
textView.isEditable = true
textView.isScrollEnabled = false
}

然后添加这个扩展:

extension ViewController: UITextViewDelegate {
func trackCaret(_ textView:UITextView){
if let selectedRange = textView.selectedTextRange {
let caretRect = textView.caretRect(for: selectedRange.start)
let yPos = caretRect.origin.y - (textView.frame.height/2)
let xPos = caretRect.origin.x - (textView.frame.width/2)
textView.bounds.origin = CGPoint(x: xPos, y: yPos)
}
}
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
trackCaret(textView)
return true
}
func textViewDidBeginEditing(_ textView: UITextView) {
trackCaret(textView)
}
func textViewDidEndEditing(_ textView: UITextView) {
// If you don't need to move back to the original position you can leave this out
// textView.bounds.origin = CGPoint.zero
//or if you want smooth animated scroll back then
textView.scrollRectToVisible(CGRect(x:0,
y:0,
width: textView.bounds.width,
height: textView.bounds.height),
animated: true)
}

有了这个,你就可以得到打字机的效果,而不必到处乱跳。 didendEditing 方法仅用于滚动回原点 0,0。如果您不需要这样做,只需将其删除即可。

关于ios - 如何锁定 UITextView 中的插入符号 y 位置以创建打字机效果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47625201/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com