TextKit简介

在iOS7之前我们要实现图文混排要使用CoreText,iOS6时有了Attribute string 可以解决一些简单的富文本需求。直到iOS7 苹果推出了TextKit,TextKit是基于CoreText的并且做了面向对象的封装,这也决定了TextKit的易用性。

NSAttributeString示例

        let label = UILabel(frame: CGRectMake(0, 20, view.bounds.size.width, 100))
let labelString = "¥2000 元/位"
let attributeString = NSMutableAttributedString(string: labelString) let attributes = [
NSForegroundColorAttributeName : UIColor.redColor(),
NSFontAttributeName : UIFont.systemFontOfSize(36)
]
attributeString.addAttributes(attributes, range: NSRange(location: 0, length: 5)) label.attributedText = attributeString view.addSubview(label)

上面个例子主要使用addAttributes/addAttribute来实现富文本的效果,一些常用的键:

  • NSForegroundColorAttributeName:(UIcolor)文字颜色。
  • NSFontAttributeName:(UIFont)文字字体。
  • NSBackgroundColorAttributeName:(UIColor)背景色。
  • NSKernAttributeName:(NSNumber(float))字符之间的间距。
  • NSStrikethroughStyleAttributeName:(NSNumber(integer))删除线,值为宽度。
  • NSStrikethroughColorAttributeName:(UIColor)删除线颜色。
  • NSUnderlineStyleAttributeName:(NSNumber(integer))下划线,值为宽度。
  • NSShadowAttributeName:(NSShadow)阴影。
  • NSObliquenessAttributeName:(NSNumber(float))倾斜。
  • NSAttachmentAttributeName:(NSTextAttachment)图文混排。
  • NSParagraphStyleAttributeName:(NSParagraphStyle)段落样式。

Dynamic Type(动态文本)

Dynamic Type是iOS7中给我们的开发带来变化最多的特性之一,它的作用是让应用中的字体大小遵循你设置的字体大小和粗细,这会更加增强可读性和用户体验。

为了让自己的应用支持Dynamic Type需要设置文本支持某一个风格而不是指定具体的字体,方法是:UIFont.preferredFontForTextStyle(样式)。

这个方法会根据你设置的样式和用户设置的字体大小来返回一个字体。

注意:在iOS8中Tableview的cell如果没有自定义,那么无需设置动态文本 它是已经封装好的,并且在切出程序进入设置调整字体大小后再切回 也会即可做出字体改变。但是在iOS7中或自定义cell时需要手动设置动态文本。

cell.textLabel?.font = UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline)

textView.font = UIFont.preferredFontForTextStyle(UIFontTextStyleBody)

但是现在还有一个问题,如果是iOS7环境只需要设置这些是不够的,需要监听通知 这样在切出应用设置字体后才能及时作出改变。

    override func viewDidLoad() {
super.viewDidLoad() NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(NoteListController.preferredContentSizeDidChange(_:)), name: UIContentSizeCategoryDidChangeNotification, object: nil)
} // 刷新tableview数据
func preferredContentSizeDidChange(notification: NSNotification) {
tableView.reloadData()
}
    override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(NoteContentController.preferredContentSizeDidChange(_:)), name: UIContentSizeCategoryDidChangeNotification, object: nil) textView.font = UIFont.preferredFontForTextStyle(UIFontTextStyleBody)
} // 设置textview的font
func preferredContentSizeDidChange(notification: NSNotification) {
textView.font = UIFont.preferredFontForTextStyle(UIFontTextStyleBody)
}

设置好后是这样的效果

       

       

创建环绕路径

先来看下效果:

可以看出textview的文字避开了时间视图,下面来看下代码:

// 首先创建timeview 添加到textview上
let date = TimeView(date: NSDate())
textView.addSubview(date) self.timeView = date // 重写viewDidLayoutSubviews 在controller布局子视图的时候更新timeview的size 然后设置frame 最后指定环绕路径
override func viewDidLayoutSubviews() {
timeView.updateSize()
timeView.frame = CGRectOffset(timeView.frame, textView.frame.width - timeView.frame.width, 0)
// 注意 指定的环绕路径是数组 这证明textview可以指定多个环绕路径 类型为[UIBezierPath] curvePathWithOrigin方法是通过一个CGPoint返回一个UIBezierPath 这个路径就是圆形的路径
textView.textContainer.exclusionPaths = [timeView.curvePathWithOrigin(timeView.center)]
}

学习TextKit框架(上)的更多相关文章

  1. Spring框架学习总结(上)

    目录 1.Spring的概述 2.Spring的入门(IOC) 3.Spring的工厂类 4.Spring的配置 5.Spring的属性注入 6.Spring的分模块开发的配置 @ 1.Spring的 ...

  2. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  3. 深入学习微框架:Spring Boot(转)

    转:http://www.infoq.com/cn/articles/microframeworks1-spring-boot/ 相关参考: https://spring.io/guides/gs/s ...

  4. 人工智能范畴及深度学习主流框架,IBM Watson认知计算领域IntelligentBehavior介绍

    人工智能范畴及深度学习主流框架,IBM Watson认知计算领域IntelligentBehavior介绍 工业机器人,家用机器人这些只是人工智能的一个细分应用而已.图像识别,语音识别,推荐算法,NL ...

  5. 人工智能深度学习Caffe框架介绍,优秀的深度学习架构

    人工智能深度学习Caffe框架介绍,优秀的深度学习架构 在深度学习领域,Caffe框架是人们无法绕过的一座山.这不仅是因为它无论在结构.性能上,还是在代码质量上,都称得上一款十分出色的开源框架.更重要 ...

  6. 从Theano到Lasagne:基于Python的深度学习的框架和库

    从Theano到Lasagne:基于Python的深度学习的框架和库 摘要:最近,深度神经网络以“Deep Dreams”形式在网站中如雨后春笋般出现,或是像谷歌研究原创论文中描述的那样:Incept ...

  7. 深入浅出学习Hibernate框架(一):从实例入手初识Hibernate框架

    这篇博客是hibernate学习的第一篇,主要简介hibernate框架,之后简单说一下hibernate的文件夹结构,最后写一个简单的hibernate实例.通过这三步来简单的认识一下hiberna ...

  8. 深入浅出学习Spring框架(四):IoC和AOP的应用——事务配置

    在前文 深入浅出学习Spring框架(一):通过Demo阐述IoC和DI的优势所在. 深入浅出学习Spring框架(三):AOP 详解 分别介绍了Spring的核心功能——IoC和AOP,光讲知识远远 ...

  9. 跟着刚哥学习Spring框架--创建HelloWorld项目(一)

    1.Spring框架简介 Spring是一个开源框架,Spring是在2003年兴起的一个轻量级的开源框架,由Rod johnson创建.主要对JavaBean的生命周期进行管理的轻量级框架,Spri ...

随机推荐

  1. hi3531的h264压缩中改动波特率

    typedef struct hiVENC_ATTR_H264_CBR_S { HI_U32 u32Gop; HI_U32 u32StatTime; HI_U32 u32ViFrmRate; HI_F ...

  2. mysql 5.6 oom 图

  3. autocommit=0

    mysql; Query OK, rows affected (0.00 sec) mysql> create table test( a int); Query OK, rows affect ...

  4. careercup-树与图 4.9

    4.9 给定一颗二叉树,其中每个结点都含有一个数值.设计一个算法,打印结点数值总和等于某个给定值的所有路径.注意,路径不一定非得从二叉树的根节点或叶子节点开始或结束. 类似于leetcode:Path ...

  5. UDID

    大多数应用都会用到苹果设备的UDID号,UDID通常有以下两种用途: 1)用于一些统计与分析目的:[第三方统计工具如友盟,广告商如ADMOB等] 2)将UDID作为用户ID来唯一识别用户,省去用户名, ...

  6. google DNS

    DNS 8.8.8.8 然后 C:\Windows\System32\drivers\etc\hosts 108.111.1.1  www.s.com

  7. 认识copy关键

    首先先引用阳神Sunny博客中的一道面试题: 用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造 ...

  8. javascript中的内置对象

    2015.12.1 javascript中的内置对象 复习: 1.js中的内置函数 alert prompt write parseInt parseFloat eval isNaN document ...

  9. 友元(friend)--初学篇

    友元:友好的元子,,,,呵呵呵 一般一个类中有私有(private),公有(public),和保护(protected)三种类型成员,而只有public成员才可以在类外被随便访问,protected只 ...

  10. sea.js 学习

    开篇:终于学习了sea.js的使用了,因为它是一个模块加载工具,所以首先要了解javascript的模块编程,然后对sea.js的了解和使用 javascript 模块编程 为什么要模块化编程,为了让 ...