iOS应用UITextView初始光标过小问题求助
解决UITextView初始光标尺寸过小的问题
我之前也碰到过这个坑!当UITextView刚被点击进入编辑状态、还没输入任何内容时,因为没有文本行高作为参考,光标会变得特别小;一旦输入文字,系统就会根据字体行高调整光标尺寸,恢复正常大小。要让初始光标和输入时保持一致,可以试试下面这几个方案:
方案一:设置占位文本(最推荐)
这不仅能解决光标问题,还能提升用户体验,让用户清楚知道这里该输入什么。我们给UITextView加个占位文本,让它初始就有行高参考:
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UITextViewDelegate { @IBOutlet weak var userMessageTextView: UITextView! // 定义占位文本和对应颜色 private let placeholderText = "请输入消息..." private let placeholderColor = UIColor.lightGray override func viewDidLoad() { super.viewDidLoad() self.userMessageTextView.delegate = self // 你的原有样式设置 userMessageTextView.layer.borderColor = UIColor(red: 0.9, green: 0.9, blue: 0.9, alpha: 1.0).cgColor userMessageTextView.layer.borderWidth = 1.0 userMessageTextView.layer.cornerRadius = 5 // 初始化占位文本 userMessageTextView.text = placeholderText userMessageTextView.textColor = placeholderColor } func textViewDidBeginEditing(_ textView: UITextView) { // 编辑开始时移除占位文本 if textView.text == placeholderText && textView.textColor == placeholderColor { textView.text = nil textView.textColor = .black } // 你的原有光标居中调整逻辑 userMessageTextView.contentOffset.y = 4.0 } func textViewDidEndEditing(_ textView: UITextView) { // 编辑结束后如果文本为空,恢复占位文本 if textView.text.isEmpty { textView.text = placeholderText textView.textColor = placeholderColor } } }
方案二:强制固定文本行高
要是不想用占位文本,可以直接给UITextView的文本容器设置固定行高,让光标始终参考这个高度:
在你的viewDidLoad方法里添加这段代码:
// 基于TextView的字体设置固定行高 guard let font = userMessageTextView.font else { return } let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.minimumLineHeight = font.lineHeight paragraphStyle.maximumLineHeight = font.lineHeight userMessageTextView.typingAttributes[.paragraphStyle] = paragraphStyle
这样不管有没有文本,光标都会匹配你设置的行高,和输入时的尺寸保持一致。
方案三:临时模拟输入(不推荐)
这个方法有点取巧,在编辑开始时先插入一个空格再删除,强制系统计算行高:
func textViewDidBeginEditing(_ textView: UITextView) { // 临时插入空格再删除,触发系统行高计算 textView.insertText(" ") textView.deleteBackward() // 你的原有光标居中调整逻辑 userMessageTextView.contentOffset.y = 4.0 }
虽然能解决问题,但可能会有轻微的视觉闪烁,所以优先推荐前两种方案。
问题原因小科普
出现这个问题的本质是:UITextView在没有文本的时候,无法确定当前字体对应的行高,所以会使用最小的默认光标尺寸;一旦有文本输入,系统会根据字体的行高自动调整光标高度,这就出现了前后光标大小不一样的情况。
内容的提问来源于stack exchange,提问作者Everett
相关产品推荐
相关产品推荐

