UITextView删除原有字符串时,光标会上移并且光标会变高

news/2025/2/23 6:07:20

代码运行效果如图:

  

import Foundation

class TestVC: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let testV = MyCustomTextView(frame: CGRect(x: 0, y: 130, width: SCREEN_WIDTH - 50, height: 170))
        self.view.addSubview(testV)
        testV.backgroundColor = .darkGray
                
        let ps = NSMutableParagraphStyle()
        ps.lineSpacing = 7
        ps.alignment = .left
        
       let attr = NSMutableAttributedString(string: "字", attributes: [
            .font: UIFont.systemFont(ofSize: 20),
            .foregroundColor: UIColor.blue,
            .paragraphStyle: ps.copy()
        ])
        
        testV.attributedText = attr
    }
}

extension TestVC: UITextViewDelegate {
    func textViewDidChange(_ textView: UITextView) {
        let text = textView.text ?? ""
        
        let ps = NSMutableParagraphStyle()
        ps.lineSpacing = 7
        ps.alignment = .left
        
        let attr = NSMutableAttributedString(string: text, attributes: [
            .font: UIFont.systemFont(ofSize: 20),
            .foregroundColor: UIColor.blue,
            .paragraphStyle: ps.copy()
        ])
        
        textView.attributedText = attr
    }
}

class MyCustomTextView: UITextView {
    override func caretRect(for position: UITextPosition) -> CGRect {
        var rect = super.caretRect(for: position)
        var text = self.text
        // 计算字符串为空时的textView rect, 避免删完字符串时出现的光标变高和上移问题
        // 如果自己还要做换行效果, 那么只在self.text.isEmpty时用sizeToFit
        if self.text.isEmpty {
            //  用"AAgg"可以算出字符串最大高度, 因为一个往上占据位置, 一个往下占据位置.
            text = "AAgg"
        }
        
        let label = UILabel()
        label.font = self.font
        label.text = text
        label.sizeToFit()
        rect.size.height = label.height
        
        return rect
    }
}


http://www.niftyadmin.cn/n/5863071.html

相关文章

23种设计模式之《桥接模式(Bridge)》在c#中的应用及理解

程序设计中的主要设计模式通常分为三大类,共23种: 1. 创建型模式(Creational Patterns) 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。 工厂方法模式&#xff0…

近地面无人机遥感:如何利用高光谱数据反演植被生理参数?

文章目录 前言专题一、近十年近地面无人机植被遥感文献分析、传感器选择、观测方式及质量控制要点1.1. 近十余年无人机植被遥感文献分析1.2. 无人机遥感的特点及与卫星遥感的差异1.3. 无人机传感器类型、特点及选择1.4. 无人机遥感观测方式、特点与质量控制 二、辐射度量与地物…

buu-ciscn_2019_n_5-好久不见41

由于目标程序的 BSS 段(包含 name 变量)权限是全开的(可读、可写、可执行),并且没有启用 NX(No Execute,非执行)保护机制,因此可以直接在 BSS 段上构造 Shellcode&#x…

Eclipse2024中文汉化教程(图文版)

对应Eclipse,部分人需要中文汉化,本章教程,介绍如何对Eclipse进行汉化的具体步骤。 一、汉化前的Eclipse 默认安装Eclipse的时候,默认一般都是English的,我当前版本是使用的是2024-06版本的Eclipse。 二、汉化详细步骤 点击上方菜单选项卡,Hep——Install New Software……

ARM Linux下FFmpeg+Nginx+RTMP 视频监控

一、流媒体协议 RTSP(Real-Time Stream Protocol)由 Real Networks 和 Netscape 共同提出的,基于文本的多媒体播放 控制协议。RTSP 定义流格式,流数据经由 RTP 传输;RTSP 实时效果非常好,适合视频聊天&…

vue中将el-table导出为excel文件

在 Vue Element UI 中,el-table 数据导出 Excel 文件,可以使用 xlsx(SheetJS)库进行处理。以下是详细的实现方法,包括安装依赖、代码示例和优化建议。 1. 安装依赖 首先,安装 xlsx 库: 复制…

宝塔扩容——阿里云如何操作

一、创建快照 磁盘快照,将数据备份,防止丢失。 1.登录“阿里云”账号 2.点击“控制台”——“云服务器 ECS” 3.点击“基本信息”下,右下角“系统盘” 4.点击“创建快照” 二、磁盘扩容 1.点击“云盘扩容” 2. 选择自己要扩容的大小 …

代码笔记插件

idea代码笔记插件 AnNote是一款代码笔记插件,支持多种语言,支持代码高亮,支持代码自动补全,支持搜索、支持附件,支持markdown格式文件 AnNote - IntelliJ IDEs Plugin | Marketplace 75折折扣: MGRYF-TJ…