学习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 ...
随机推荐
- 使用phpize建立php扩展(Cannot find config.m4)(转)
php源码:/root/soft/php-5.3.4php安装: /usr/local/php [root@ns root]# phpizeCannot find config.m4.Make sur ...
- 没有找到MSVCR100.dll解决方法
转自:http://hi.baidu.com/fjdvd/blog/item/3679b201ec3d6b154afb515d.html MSVCR100.dll下载(游戏丢失msvcr100.dll ...
- orczhou----MYSQL
https://yq.aliyun.com/users/1597777588650149?spm=5176.blog11192.yqblogcon1.2.5mdGQb
- pair的例子
11.12 编写程序,读入string和int的序列,将每个string和int存入一个pair中,pair保存在一个vector中. #include<iostream> #includ ...
- jQuery动态实现title的修改 失效问题
最近做了一个网站,一切都很顺利,在上线的时候,突然发现一个严重的问题,开始面对这个问题,完全不知所措(在goole.火狐.IE9及其以上都没得问题:IE8及其低版本都失效)只是浏览器弹出一个bug,但 ...
- NIO学习:使用Channel、Buffer写入文件
NIO的效率要高于标准IO,因为NIO将最耗时的IO操作(填充和提取缓冲区)转移会操作系统.NIO以块为单位传输数据,相比标准IO的以字节为单位效率要高很多. 通道和缓冲时NIO的核心对象,每个NIO ...
- Calendar 类的应用
上一篇 说的 Date 类 最主要的作用就是获得当前时间,同事这个类里面也具有设置时间以及一些其他的功能,但是由于本身设计的问题,这些方法却遭到众多的批评,不推荐使用,要推荐使用Calendar 类进 ...
- ASP.NET Identity 用户注册相关设定
此部分可以在 Web项目中的App_Start目录下的 IdentityConfig.cs 文件进行设置. 1.配置密码的验证逻辑 manager.PasswordValidator = new Pa ...
- Android数据存储技术
Android提供了4种数据存储技术,分别是SharedPreferences.Files.SQLite数据库和网络存储数据.(有的开发者认为使用ContentProvider也可以算是一种,但我觉得 ...
- javascript dom编程艺术笔记之图片库的改进
dom的操作要遵守的原则 1.平稳退化 2.分离javascript 3.向后兼容 4.性能考虑 改进后的显示图片方法 function showpic(whichpic){ if(!document ...