第一篇、Textkit的基本使用

使用:

        customLabel.text = "百度一下你就知道 http://www.baidu.com"
import UIKit

class JQLabel: UILabel {

     override var text: String?
        {
        didSet{
            // 1.修改textStorage存储的内容
            textStorage.setAttributedString(NSAttributedString(string: text!))

            // 2.设置textStorage的属性
            textStorage.addAttribute(NSFontAttributeName, value: UIFont.systemFontOfSize(20), range: NSMakeRange(0, text!.characters.count))

            // 3.处理URL
            self.URLRegex()

            // 2.通知layoutManager重新布局
            setNeedsDisplay()
        }
    }

    // 如果是UILabel调用setNeedsDisplay方法, 系统会促发drawTextInRect
    override func drawTextInRect(rect: CGRect) {
        // 重绘
        // 字形 ; 理解为一个小的UIView
        /*
        第一个参数: 指定绘制的范围
        第二个参数: 指定从什么位置开始绘制
        */
        layoutManager.drawGlyphsForGlyphRange(NSMakeRange(0, text!.characters.count), atPoint: CGPointZero)
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        setupSystem()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setupSystem()
    }

    private func setupSystem()
    {
        // 1.将layoutManager添加到textStorage
        textStorage.addLayoutManager(layoutManager)
        // 2.将textContainer添加到layoutManager
        layoutManager.addTextContainer(textContainer)
    }

    override func layoutSubviews() {
        super.layoutSubviews()

        // 3.指定区域
        textContainer.size = bounds.size
    }

    // MARK: -懒加载
    /*
    只要textStorage中的内容发生变化, 就可以通知layoutManager重新布局
    layoutManager重新布局需要知道绘制到什么地方, 所以layoutManager就会文textContainer绘制的区域
    */

    // 准们用于存储内容的
    // textStorage 中有 layoutManager
    private lazy var textStorage = NSTextStorage()

    // 专门用于管理布局
    // layoutManager 中有 textContainer
    private lazy var layoutManager = NSLayoutManager()

    // 专门用于指定绘制的区域
    private lazy var textContainer = NSTextContainer()

    func URLRegex()
    {

        // 1.创建一个正则表达式对象
        do{
            let dataDetector = try NSDataDetector(types: NSTextCheckingTypes(NSTextCheckingType.Link.rawValue))

            let res =  dataDetector.matchesInString(textStorage.string, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, textStorage.string.characters.count))

            // 4取出结果
            for checkingRes in res
            {
                let str = (textStorage.string as NSString).substringWithRange(checkingRes.range)
                let tempStr = NSMutableAttributedString(string: str)

//                tempStr.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range: NSMakeRange(0, str.characters.count))
                tempStr.addAttributes([NSFontAttributeName: UIFont.systemFontOfSize(20), NSForegroundColorAttributeName: UIColor.redColor()], range: NSMakeRange(0, str.characters.count))

                textStorage.replaceCharactersInRange(checkingRes.range, withAttributedString: tempStr)
            }
        }catch
        {
            print(error)
        }

    }

}

点击事件的处理:

import UIKit

class JQTextView: UITextView {

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

        // 1.获取手指点击的位置
        let touch = (touches as NSSet).anyObject()!
        let point = touch.locationInView(touch.view)

        print(point)

        // 2.获取URL的区域
        // 注意: 没有办法直接设置UITextRange的范围
        let range = NSMakeRange(10, 20)
        // 只要设置selectedRange, 那么就相当于设置了selectedTextRange
        selectedRange = range

        // 给定指定的range, 返回range对应的字符串的rect
        // 返回数组的原因是因为文字可能换行
        let array = selectionRectsForRange(selectedTextRange!)

        for selectionRect in array{
//            let tempView = UIView(frame: selectionRect.rect)
//            tempView.backgroundColor = UIColor.redColor()
//            addSubview(tempView)

            if CGRectContainsPoint(selectionRect.rect, point)
            {
                print("点击了URL")
            }
        }

    }
}
时间: 2024-09-29 23:10:31

第一篇、Textkit的基本使用的相关文章

CSS px, em, 和rem; float以及clear(第一篇学习)

px:相对长度,相对于屏幕分辨率: em:相对长度单位,相对于当前对象内文本的字体尺寸.如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸.  任意浏览器的默认字体高都是16px.所有未经调整的浏览器都符合: 1em=16px.那么12px=0.75em,10px=0.625em.为了简化font-size的换算,需要在css中的body选择器中声明Font-size=62.5%,这就使em值变为 16px*62.5%=10px, 这样 12px=1.2em, 10px=1em

无限互联奖学金文章连载北京总部四十九期胡梦川 第一篇

无限互联奖学金文章连载北京总部四十九期胡梦川 第一篇: 今天是来到无限互联的第四天,严格来说已经第六天了,刚来就是开班典礼,给人一种很好的氛围.老师讲了很多关于以后学习的技巧和规定,我的第一感觉是,比备战高考还要严格,不过这才能体现一个组织的负责任.正式开讲才感觉到这个班级的大神无处不在,不努力根本赶不上,就是这个学习氛围和高强度的练习很重要.多用心你才能感觉到有些事其实很简单.关于学习时间大家基本都是一天不动的在敲代码,等于给自己一个机会吧.时间飞逝,抓住机会才重要.刚来第一周,感受最深就是好

第一篇

奖学金文章连载北京总部四十九期胡梦川 第一篇: 今天是来到无限互联的第四天,严格来说已经第六天了,刚来就是开班典礼,给人一种很好的氛围.老师讲了很多关于以后学习的技巧和规定,我的第一感觉是,比备战高考还要严格,不过这才能体现一个组织的负责任.正式开讲才感觉到这个班级的大神无处不在,不努力根本赶不上,就是这个学习氛围和高强度的练习很重要.多用心你才能感觉到有些事其实很简单.关于学习时间大家基本都是一天不动的在敲代码,等于给自己一个机会吧.时间飞逝,抓住机会才重要.刚来第一周,感受最深就是好多事做了

SaltStack 入门到精通 - 第一篇: 安装SaltStack

实际环境的设定: 系统环境: centos6 或centos5 实验机器: 192.168.1.100 软件需求: salt 套件,及其需求环境 实验目的: 成功安装salt,并实现salt主从间通讯 特殊设置: 其它目的: 安装SaltStack(下面简称为salt) epel安装:salt安装需要epel源支持,所以在安装salt前需要先安装epel包 # centos5 下载下面rpm  wget -O    epel.rpm https://dl.fedoraproject.org/pu

jstl标签 core fmt fn函数使用参考(为第一篇的补充,更为实用)

JSTL标签 参考手册 前言 ========================================================================= JSTL标签库,是日常开发经常使用的,也是众多标签中性能最好的.把常用的内容,放在这里备份一份,随用随查.尽量做到不用查,就可以随手就可以写出来.这算是Java程序员的基本功吧,一定要扎实. JSTL全名为JavaServer Pages Standard Tag Library,目前最新的版本为1.1版.JSTL是由J

Python开发【第一篇】:目录

本系列博文改编自武沛齐老师的原创博文,主要包含  Python基础.前端开发.Web框架.缓存以及队列等内容 ,用于学习记录成长!!! Python开发[第一篇]:目录 Python开发[第二篇]:初识Python

Eclipse插件开发 学习笔记 PDF 第一篇到第四篇 免分下载 开发基础 核心技术 高级进阶 综合实例

<<Eclipse插件开发 学习笔记>>,本书由浅入深.有重点.有针对性地介绍了Eclipse插件开发技术,全书分为4篇共24章.第一篇介绍Eclipse平台界面开发的基础知识.包含SWT控件的使用.界面布局.事件处理等内容:第二篇是插件开发核心技术,主要介绍插件开发的核心知识要点,包含行为(Action).视图(ViewPart).编辑器(Editor).透视图(Perspective)等10章的内容.第三篇主要讲述插件开发的高级内容,包含开发高级内容.富client平台技术(R

U-BOOT-2016.07移植 (第一篇) 初步分析

U-BOOT-2016.07移植 (第一篇) 初步分析 目录 U-BOOT-201607移植 第一篇 初步分析 目录 编译和移植环境 更新交叉编译工具 1 下载arm-linux-gcc 443 2 安装arm-linux-gcc 443 安装环境Ubuntu 910 下载u-boot-201607并解压 分析顶层Makefile 1 找出目标依赖关系 2 总结 初次编译u-boot 1 配置 2 编译 分析u-boot启动流程 1 分析startS 2 分析crt0S 3 总结 1. 编译和移

我的第一篇博文:输入法编程

这是我的第一篇博文,在这之前,我要介绍一下我自己.我是一名核电工程师,已经工作了19年,我同时也是一名计算机爱好者.我利用业余时间学习编程. 最近我研究了输入法的编程.我阅读了很多园里的文章,特别是借鉴了启程之星公开的客户端的源码.研究已经取得进展,可惜眼睛看坏了,现在不是很方便用计算机,所以等我眼睛好一些时候,我会更详细地介绍我研究的输入法的心得.我做的几件事如下: 1. 启程之星输入法源码的主要原理搞懂了.编译成功,知道主要部分的逻辑关系: 2. 研究了启程之星最近版与服务器通讯的原理(此部

第一篇 SQL Server安全概述

本篇文章是SQL Server安全系列的第一篇,详细内容请参考原文. 面对当今复杂的攻击SQL Server有你需要的一切来保护你的服务器和数据.但在你能有效地使用这些安全功能之前,你需要了解你所面临的威胁和一些基本的安全概念.本系列的第一篇将讲解基础知识,可以充分利用SQL Server中的安全功能而不是浪费时间在不能保护你的数据被威胁的功能上.Relational databases are used in an amazing variety of applications with co