学习TextKit框架(上)
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框架(上)的更多相关文章
- Spring框架学习总结(上)
目录 1.Spring的概述 2.Spring的入门(IOC) 3.Spring的工厂类 4.Spring的配置 5.Spring的属性注入 6.Spring的分模块开发的配置 @ 1.Spring的 ...
- ABP入门系列(1)——学习Abp框架之实操演练
作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...
- 深入学习微框架:Spring Boot(转)
转:http://www.infoq.com/cn/articles/microframeworks1-spring-boot/ 相关参考: https://spring.io/guides/gs/s ...
- 人工智能范畴及深度学习主流框架,IBM Watson认知计算领域IntelligentBehavior介绍
人工智能范畴及深度学习主流框架,IBM Watson认知计算领域IntelligentBehavior介绍 工业机器人,家用机器人这些只是人工智能的一个细分应用而已.图像识别,语音识别,推荐算法,NL ...
- 人工智能深度学习Caffe框架介绍,优秀的深度学习架构
人工智能深度学习Caffe框架介绍,优秀的深度学习架构 在深度学习领域,Caffe框架是人们无法绕过的一座山.这不仅是因为它无论在结构.性能上,还是在代码质量上,都称得上一款十分出色的开源框架.更重要 ...
- 从Theano到Lasagne:基于Python的深度学习的框架和库
从Theano到Lasagne:基于Python的深度学习的框架和库 摘要:最近,深度神经网络以“Deep Dreams”形式在网站中如雨后春笋般出现,或是像谷歌研究原创论文中描述的那样:Incept ...
- 深入浅出学习Hibernate框架(一):从实例入手初识Hibernate框架
这篇博客是hibernate学习的第一篇,主要简介hibernate框架,之后简单说一下hibernate的文件夹结构,最后写一个简单的hibernate实例.通过这三步来简单的认识一下hiberna ...
- 深入浅出学习Spring框架(四):IoC和AOP的应用——事务配置
在前文 深入浅出学习Spring框架(一):通过Demo阐述IoC和DI的优势所在. 深入浅出学习Spring框架(三):AOP 详解 分别介绍了Spring的核心功能——IoC和AOP,光讲知识远远 ...
- 跟着刚哥学习Spring框架--创建HelloWorld项目(一)
1.Spring框架简介 Spring是一个开源框架,Spring是在2003年兴起的一个轻量级的开源框架,由Rod johnson创建.主要对JavaBean的生命周期进行管理的轻量级框架,Spri ...
随机推荐
- android 模拟器定在了任务栏出不来了
系统 任务栏上显示了正在运行的模拟器,但是点击它,始终看不到模拟器显示出来.用Alt + Tab 切换也不行 按照网上的说法 1.重新建一个模拟器,名字变一下 2.找到模拟器对应的配置文件,路径不管, ...
- MVC - 布局
布局类似于APSX视图的母版页 用的是Razor的语法 创建布局 布局页面默认放在Shared目录 有几个自动生成的cshtml文件 删除它们 然后创建一个视图 命名为MyLayOut 取消勾选使用母 ...
- Cocos2d-x实现粒子效果的三种方式
在Cocos2d-x中,实现粒子效果可以有三种方法. Normal 0 10 pt 0 2 false false false EN-US ZH-CN X-NONE $([{£¥·'"〈&l ...
- spinner中的onNothingSelected方法到底什么时候调用?
这个东东大家在开发中可能不太能用到,所以总是容易被忽略,由于工作原因,我最近琢磨了一下onNothingSelected方法的调用时机问题,其实很简单,只要我们稍微看一下源码就明白了: /** * C ...
- Android(java)学习笔记150:为什么局部内部类只能访问外部类中的 final型的常量
为什么匿名内部类参数必须为final类型: 1) 从程序设计语言的理论上:局部内部类(即:定义在方法中的内部类),由于本身就是在方法内部(可出现在形式参数定义处或者方法体处),因而访问方法中的局部变 ...
- iOS之应用程序国际化
一.程序国际化 准备工作: 1.首先我们要先创建一个工程,我们给他命名Internationalization-Demo,然后添加语言. 从代码中分离文本: 目前,应用展示的所有文本都是以硬编码字符串 ...
- JAVA锁的可重入性
机制:每个锁都关联一个请求计数器和一个占有他的线程,当请求计数器为0时,这个锁可以被认为是unhled的,当一个线程请求一个unheld的锁时,JVM记录锁的拥有者,并把锁的请求计数加1,如果同一个线 ...
- 读取group by 之外的字段
序号 姓名 性别 身高 1 张三 男 185 2 李四 女 161 3 王五 女 166 4 赵六 男 178 1.获取男生女生人数 select count(性别) , 性别 from 表名 ...
- 自定义标签 tld
初学者可能在不借助IDE工具的情况下 编写自定义标签库 tld 程序可能遇到找不到class 的错误,下面讲解一下如何解决该问题 步骤一:新建一个自定义标签类 HelloWorldTag,该类放到s ...
- js高程 第 4章 变量、作用域和内存问题 【笔记】
4.4 小结 JavaScript变量可以用来保存两种类型的值:基本类型值和引用类型值.基本类型的值源自以下 5 种基本数据类型:Undefined.Null.Boolean.Number 和 Str ...