本文将带你了解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频道!

ios开发text kit_IOS开发入门之TextKit详解相关推荐

  1. 【IOS 开发】Objective - C 入门 之 数据类型详解

    作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/38544659 1. 数据类型简介及输出 (1) 数据类型简介 ...

  2. 【IOS 开发】Object - C 入门 之 数据类型详解

    转载来自: http://blog.csdn.net/shulianghan/article/details/38544659 1. 数据类型简介及输出 (1) 数据类型简介 数据类型简介 : Obj ...

  3. 《微信小程序:开发入门及案例详解》—— 3.4 小结

    本节书摘来自华章出版社<微信小程序:开发入门及案例详解>一 书中的第3章,第3.4节,作者李骏 边思,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 3.4 小 ...

  4. Go 语言快速开发入门(基础语法详解,第一节)

    Go 语言快速开发入门(基础语法详解,第一节) 一.基础语法详解,第一节 1.HelloWorld 1.1.代码编写和解释 1.2.go语言注意事项 2.Go 语言的转义字符&&Go ...

  5. 移动端开发touchstart,touchmove,touchend事件详解和项目

    移动端开发touchstart,touchmove,touchend事件详解和项目 最近在做移动端的开发,在一个"服务商管理"页面使用到了触摸事件"touchstart& ...

  6. unity3d开发实战《啪啪三国》技术详解!

    unity3d开发实战<啪啪三国>技术详解!  去年11月,上海火溶网络CEO王伟峰以其第一款3d手游产品<啪啪三国>为例,着重讲解了unity3D手机网游开发的经验,其中涉及 ...

  7. android生命周期_Android开发 View的生命周期结合代码详解

    咱们以TextView控件为例: /** * Created by SunshineBoy on 2020/9/23. */ public class TestTextView extends and ...

  8. php安装与下载,学习PHP网站开发 连载——PHPCMS的下载与安装详解

    原标题:学习PHP网站开发 连载--PHPCMS的下载与安装详解 首先是要下载,然后安装,才能在本地学习和调试 1:下载 PHPCMS官网地址:www.phpcms.cn 接着点击: 下载结果: 解压 ...

  9. HMI智能串口屏——在STM32开发板上的实战应用及其详解

    HMI智能串口屏--在STM32开发板上的实战应用及其详解 一.HMI智能串口屏使用步骤 二.附录 一.HMI智能串口屏使用步骤 安装USART HMI软件 (一般买的串口屏里面,商家送的资料里面都有 ...

最新文章

  1. 数据挖据之GeoHash核心原理解析
  2. WinCE文件目录定制
  3. HTML学习01之初识HTML
  4. seo html空格影响,这一对HTML标签嵌套对SEO优化的影响,居然99%的人不知道!
  5. 11_CollapsingMergeTree,(State行和Cancel行匹配示例),聚合查询,Cancel状态行取反的聚合查询
  6. (转)iOS面试题目
  7. oracle中exp/imp讲解
  8. 比反射更快:委托 第1部分
  9. sql练习三(DataWhale 系列-最终)
  10. python 服务端判断客户端异常断开
  11. 耐高温轴承1000度_1000度耐高温轴承的类型选择--SIAIF耐高温轴承
  12. 手机安装W ndows7镜像,Windows7ISO镜像安装系统教程
  13. web页面跳转支付宝网页支付
  14. mysql 1236错误_MySQL主从失败 错误Got fatal error 1236解决方法
  15. h5计时器(requestAnimationFrame)
  16. 大学生毕业后的档案问题如何处理
  17. java8中的Stream用法详解
  18. 白平衡测试—imatest
  19. oracle12c口令文件,学习笔记:Oracle 12C ASM 新特性 共享密码文件
  20. hta 北京自动挂号器

热门文章

  1. Demosaic算法学习
  2. /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.15' not found错误的解决
  3. 第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波6 - 分段线性变换 - 比特平面分层
  4. python dialect='excel'是什么意思_python读取和生成excel文件
  5. float浮动,定位
  6. #10172. 「一本通 5.4 练习 1」涂抹果酱 题解
  7. Pandas CookBook -- 04选取数据子集
  8. 简单实现顶部固定,中部自适应布局
  9. 51nod 1040最大公约数和(欧拉函数)
  10. linux下vi修改文件用法