ios开发text kit_IOS开发入门之TextKit详解

本文将带你了解IOS开发入门iOS 开发 富文本详解之TextKit详解,希望本文对大家学IOS有所帮助。

textkit结构

textkit使用步骤

#Mark - 1. 自定义label  --class CZLabel: UILabel---四个属性

//1.属性文本存储

private lazy var textStorage = NSTextStorage()

//2.负责文本字形布局对象

private lazy var layoutManager = NSLayoutManager()

//3.设定文本绘制的范围

private lazy var textContainer = NSTextContainer()

//4.属性数组,保存匹配的范围

private lazy var linkRanges = [NSRange]()

#Mark - 2. 重新init方法-- override init(frame: CGRect) {}

//0.开启用户交互

userInteractionEnabled = true

//1.textStorage接管label的属性

if let attributedText = attributedText {}

//2.设置对象关系

textStorage.addLayoutManager(layoutManager)

layoutManager.addTextContainer(textContainer)

#Mark - 3. 外界给label的text属性赋值  label.text = @"@好友,#健康#,....."

//重写属性的text方法--一旦label里的内容发生变化,就可以让textStorage相应变化

//1.段落处理--1.范围  2.属性  3.段落样式

let attrStringM = addLineBreak(attributedText!)

//2.正则匹配--1.清空原有  2.匹配范围  3.创建正则  4.匹配  5.遍历匹配结果,添加到属性数组

regexLinkRanges(attrStringM)

//3.连接颜色设置---1.范围  2.属性  3.添加颜色  4.遍历属性数组,改变颜色

addLinkAttribute(attrStringM)

//4.添加到textStorage

textStorage.setAttributedString(attrStringM)

//5.重新绘制

setNeedsDisplay()

#Mark - 4. textStorage字形和属性发生变化时,通知NSLayoutManager重新布局文本

//MARK:3.设置布局--制定文本绘制区域

override func layoutSubviews() {

super.layoutSubviews()

//制定文本绘制区域

textContainer.size = bounds.size

}

#Mark - 5. 绘制textStorage的文本内容--不能调用super

override func drawTextInRect(rect: CGRect) {

let range = NSMakeRange(0, textStorage.length)

//Glyphs--字形---CGPoint()从原点绘制,也就是右上角

layoutManager.drawGlyphsForGlyphRange(range, atPoint: CGPoint(x: 0,y: 0))

}

#Mark - 6. 用户点击事件交互

//0.懒加载@ # URL的匹配的正则法则 三个属性数组

三步法:1.正则表达式  2.创建正则  3.匹配  4.便利匹配结果,添加到属性数组

//1.获取用户点击的位置

let location = touches.first?.locationInView(self)

//2.获取当前点中字符的索引

let index = layoutManager.glyphIndexForPoint(location, inTextContainer: textContainer)

//3.判断index在哪个标记的range 范围上

for range in atRange ?? [] {

if NSLocationInRange(index, range) {

let strSub = (textStorage.string as NSString).substringWithRange(range)

//进行结果处理

}

}

Swift使用

import UIKit

class ZYLabel: UILabel {        //attributedText富文本

//MARK:2.重写属性text方法,可以在ViewController里给文本赋值

//一旦label里的内容发生变化,就可以让textStorage相应变化

override var text:String? {

didSet {

if attributedText == nil {

return

}

//换行处理属性

let attrStringM = addLineBreak(attributedText!)

//换行后进行--正则匹配

regexLinkRanges(attrStringM)

//换行后进行--连接颜色设置

addLinkAttribute(attrStringM)

//添加到textStorage

textStorage.setAttributedString(attrStringM)

//重新绘制

setNeedsDisplay()

}

}

///MARK: textKit的三个核心对象

//属性文本存储

private lazy var textStorage = NSTextStorage()

//负责文本字形布局对象

private lazy var layoutManager = NSLayoutManager()

//设定文本绘制的范围

private lazy var textContainer = NSTextContainer()

private lazy var linkRanges = [NSRange]()

//纯代码接管Label

override init(frame: CGRect) {

super.init(frame: frame)

//0.开启用户交互

userInteractionEnabled = true

//1.textStorage接管label的属性

if let attributedText = attributedText {        //如果原有文本设置了attribute

textStorage.setAttributedString(attributedText)

}else if let text = text {      //如果原有文本没有设置attribute

textStorage.setAttributedString(NSAttributedString(string: text))

}else {     //如果原有文本为nil

textStorage.setAttributedString(NSAttributedString(string: ""))

}

//2.设置对象关系

textStorage.addLayoutManager(layoutManager)

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之IOS频道!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/270959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式数据库技术基础:数据分片介绍

1、数据分片定义数据分片也成为数据分割,是分布式数据库的特征之一。一般在一个分布式数据库中,全局数据库是由各个局部数据库逻辑组合而成的,反之各个局部数据库是由全局数据库的某种分割逻辑而得的。数据分片得到的各部分元组成为该关系的逻…

9.02

1.input标签&#xff1a;<input> 标签用于搜集用户信息。根据不同的 type 属性值&#xff0c;输入字段拥有很多种形式。 输入字段可以是文本字段、复选框、掩码后的文本控件、单选按钮、按钮等等。例如&#xff1a;Frist name:<input type"text" name"…

分布式数据库技术基础:分布透明性相关知识

1、分布透明性介绍数据分布独立性&#xff1a;主要是指用户或用户程序使用分布式数据库如同使用集中式数据库那样&#xff0c;不必关系全局数据的分布情况。也就是说全局数据的逻辑分片、片段的物理位置分配、各场地数据库的数据模型等情况对用户和用户应用程序是透明的。因此分…

宏基4750网卡驱动linux,宏基4750g网卡驱动下载

宏基4750g网卡驱动是宏基笔记本上网驱动&#xff0c;驱动可以帮助用户体验便捷上网功能&#xff0c;只需要的双击驱动安装就可以完成&#xff0c;网卡驱动是笔记本必备程序&#xff0c;欢迎用户来当易网下载体验&#xff01;驱动介绍Acer宏碁Aspire 4750G笔记本网卡驱动14.4.0.…

python request post 数组_[pve][python]用python3获取pve状态信息

手头的Proxmox VE集群和节点越来越多&#xff0c;需要考虑统一管理了&#xff0c;先定一个小目标——集中状态监控。以前写过检测ceph并用钉钉报警的bash脚本&#xff0c;这次换上洋气的方式&#xff0c;用python来通过pve的api获取其状态信息。首先参考proxmox官方的api(实际上…

分布式数据库管理系统介绍

1、分布式数据库管理系统分类综合型体系结构&#xff1a;主要是指在分布式数据库建立之前&#xff0c;还没有建立独立的集中式数据库管理系统&#xff0c;设计人员根据用户的需求&#xff0c;设计出一个全新的完整的数据库管理系统。联合型体系结构&#xff1a;主要是指每个节点…

linux中国用户,Linux中国 适合新用户的Linux

这个争论无疑给许多Linux用户带来了麻烦。争论的焦点一般不是哪个发行版是真正最适合新用户的&#xff0c;而是哪个发行版受这些争论者的喜爱。如果我们撇开个人喜爱&#xff0c;我们会看到更清楚的一面。但即使这样&#xff0c;明确的结论也会受到被新用户的需求和期望的影响。…

关于局部变量表slot的理解

看下图代码例子&#xff0c;double类型的b,占用两个slot,所以index为3和4

Spring LDAP

LDAP Spring LDAP 使用 - Sayi像秋天一样优雅 - 开源中国社区 http://docs.spring.io/spring-ldap/docs/current/reference/#introduction http://blog.csdn.net/techchan/article/details/5438047转载于:https://www.cnblogs.com/hello-yz/p/5844784.html

挂起某线程命令 Linux,linux 线程挂起恢复的简单示例

参考&#xff1a;写了个demo&#xff1a;#include #include static pthread_mutex_t mutex;static pthread_cond_t cond;static int flag 0;void srpthread_init(){pthread_mutex_init(&mutex,NULL);pthread_cond_init(&cond,NULL);}void srpthread_suspend(){pthread…

分布式查询处理和优化相关知识介绍

一、分布式数据库查询考虑的因素1、和集中式数据查询一样需要考虑查询语言语句的优化2、数据和信息均需要通过通信线路进行数据传输&#xff0c;存在传输延迟问题从而影响整个查询的执行效率。3、网络中多处理器的存在提供了并行数据处理和传输的机会&#xff0c;可以充分利用该…

html下拉框设置默认值_如何设置HTML select下拉框的默认值?

HTML中的select标签用于创建可选择选项的下拉列表&#xff1b;option标签包含选定时将使用的值。那么如何来设置select下拉框里的默认值&#xff1f;下面本篇文章就来给大家介绍一下&#xff0c;希望对大家有所帮助。我们可以在所需选项上使用“selected”属性来设置select元素…

操作数栈的字节码指令执行分析

一&#xff1a;写个demo 二&#xff1a;点击Recompile编译 三&#xff1a;使用javap命令反编译class文件 javap -v 类名.class 四&#xff1a;查看结果 五&#xff1a;分析执行过程 首先bipush意思是把byte类型的变量i的值15存放到操作数栈中&#xff0c;istore_1的意思…

wordpress 当前栏目名,当前栏目的分类名

wordpress在设计主题和做模板时经常会用到调用当前分类栏目名称&#xff0c;常见的有当前栏目页、文章页&#xff0c;详情代码如下&#xff1a; 1.分类名称与链接 <?php the_category(); ?> 2.分类页面调用当前分类名称 要在分类页得到分类页面的栏目名称,需要用<?…

分布式数据库基础:分布式事务相关概念介绍

1、事务的定义事务式访问数据库的一个逻辑工作单位&#xff0c;它属于一个操作序列&#xff0c;执行这个操作序列使数据库从一种一致状态转换到另外一种一致状态&#xff0c;从而实现特定业务的功能。2、分布式事务的定义分布式事务属于传统事务的扩展&#xff0c;分布式事务继…

windows比linux差在哪,怎么让新手理解Linux比Windows好在哪里!

pingpang2008 于 2009-06-17 08:54:31发表:人好多啊hantu 于 2009-06-16 23:28:57发表:哈哈,偏偏很多人就是不爽windows了才用Linux的刘冲 于 2009-06-16 21:44:08发表:linux比windows好吗&#xff1f;wayoking 于 2009-06-16 20:45:11发表:理解了&#xff0c;谢谢cscs2002 于 …

12c创建为容器数据库_oracle 12c创建可插拔数据库(PDB)与用户详解

前言由于oracle 12c使用了CDB-PDB架构&#xff0c;类似于docker&#xff0c;在container-db内可以加载多个pluggable-db&#xff0c;因此安装后需要额外配置才能使用。一、修改listener.ora , tnsnames.ora###listener.ora###LISTENER (DESCRIPTION (ADDRESS (PROTOCOL TCP)(…

大型分布式存储方案MinIO介绍,看完你就懂了!

1、MinIO是什么&#xff1f;官方解释&#xff1a;MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等&#xff0c;…