从Objective-C到Swift,你必须会的(二)组合options
用过Options这个东西的人都知道,几个竖线就把这些值都和到一起了。比如:
+ (NSStringDrawingOptions)combine{
return NSStringDrawingTruncatesLastVisibleLine |
NSStringDrawingUsesLineFragmentOrigin |
NSStringDrawingUsesFontLeading;
}
很简单的一个东西啊。这个为什么要拿出一篇来专门说呢?因为,APPLE有bug!对,你在Swift里这么做是会报错的(你知道我说的是按照Swift的语法写)。比如:
let size = CGSize(width: 280, height: Int.max)
let options : NSStringDrawingOptions = .UsesLineFragmentOrigin | .UsesFontLeading let boundingRect = string.bridgeToObjectiveC().boundingRectWithSize(size, options: options, attributes: attributes, context: nil)
介个是不work的。编译器会报错:could not find memeber 'UsesLineFragmentOrigin'。但是代码还是要这么写的。遇到有必要同时满足这些不同options的时候也是只能这么写的。
但是既然有这么个bug该怎么办呢?好吧你开着Xcode还找不到现成的么有bug的办法么?想想,你会想到什么?必须是OC了。而且非常方便,虽然还是绕路了,哎。
在一个Swift项目里,添加或者导入OC文件的时候,Xcode会提示你要创建一个bridge header(桥街头文件,咱们就简称桥头吧)。如果系统没有给你间,自己也可以搞定,然后在build settings里面指定好你自己桥头的路径就好了。这个具体的会在本系列说明。
之后创建OC文件,之后实现好了你需要的功能就好了,如:
@implementation Utils
+ (NSStringDrawingOptions)combine{
return NSStringDrawingTruncatesLastVisibleLine |
NSStringDrawingUsesLineFragmentOrigin |
NSStringDrawingUsesFontLeading;
}
@end
头文件什么的就不用我详细写了吧。就是声明了一下类名称为Utils,这个类包含了一个类方法叫做combine。
只要在桥头文件里有这个OC文件的头文件import进去了,那么在Swift文件中就可以直接使用了。你不用在在任何的Swift代码里有import的想法和动作。使用的时候就这样:
let options = Utils.combine()
let calculateSize = CGSize(width: width, height: 0 as Double)
var rect = content.boundingRectWithSize(calculateSize, options: options, attributes: [NSFontAttributeName: font], context: nil)
很简单,这个问题就解决了。后面就等苹果改他的这个bug了。
从Objective-C到Swift,你必须会的(二)组合options的更多相关文章
- 【Swift学习】Swift编程之旅(二)
在本节将介绍一些最基础的知识 swift提供自己版本的类型,下面说明几种简单的类型 Int 整型 Double和float 浮点型 String 字符串型 Bool 布尔型 它也提供了3种主要的强大的 ...
- Swift基础语法学习总结二
1.函数 1.1 func funcNmae()->(){} 这样就定义了一个函数,它的参数为空,返回值为空,如果有参数和返回值直接写在两个括号里就可以了 1.2 参数需要指明类型,而如果没有返 ...
- [Swift]八大排序算法(二):快速排序
排序分为内部排序和外部排序. 内部排序:是指待排序列完全存放在内存中所进行的排序过程,适合不太大的元素序列. 外部排序:指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存 ...
- Swift 中的基础语法(二)
1.Swift 中的函数 /// 函数的定义 /// /// - Parameters: /// - x: 形参 /// - y: 形参 /// - Returns: 返回值 func sum(x: ...
- Swift开发小技巧--扫描二维码,二维码的描边与锁定,设置扫描范围,二维码的生成(高清,无码,你懂得!)
二维码的扫描,二维码的锁定与描边,二维码的扫描范围,二维码的生成(高清,无码,你懂得!),识别相册中的二维码 扫描二维码用到的三个重要对象的关系,如图: 1.懒加载各种类 // MARK: - 懒加载 ...
- swift 2.x学习笔记(二)
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #008400 } p.p2 { margin: 0.0px 0. ...
- SWIFT 闭包的简单使用二
import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: ...
- Swift实战-豆瓣电台(二)界面布局
观看地址 http://v.youku.com/v_show/id_XNzMwMDg4NzAw.html 这节的内容主要是storyboard的操作. 有以下几个知识点 1 TableView的Dat ...
- Swift - 25 - 控制转移和二维数组
//: Playground - noun: a place where people can play import UIKit // fallthrough // fallthrough会在当前c ...
随机推荐
- hadoop YARN配置参数剖析—MapReduce相关参数
MapReduce相关配置参数分为两部分,分别是JobHistory Server和应用程序参数,Job History可运行在一个独立节点上,而应用程序参数则可存放在mapred-site.xml中 ...
- apache-tomcat-7.0.8\bin\tcnative-1.dll: Can't load AMD 64-bit .dll on a IA 32-bit platform
问题: apache-tomcat-7.0.8\bin\tcnative-1.dll: Can't load AMD 64-bit .dll on a IA 32-bit platform 解决:jd ...
- linux 使用中括号进行条件判断
格式 “#”代表空格,不可缺少 [# param1#op# param2 #] 这种带比较操作符的形式,op左右必须使用空格隔开. 如 [# “3”==”2” #] 这种缺少空格的写法会得到结 ...
- emacs之配置8,gdb调试设置
emacsConfig/gdb-setting.el (global-set-key [(f5)] 'gud-go) (global-set-key [(f7)] 'gud-step) (global ...
- 智能家居入门DIY——【二、LD3320之语音识别】
前一篇说了一下只有RX,TX,VCC,GND的WIFI模块软串口通讯:在实现了远程观察数据,类似的就可以实现远程控制.接下来说一下近距离控制,很多情况下应用语音识别技术无疑比掏出手机操作要更人性化一些 ...
- 无法正确解析FreeMarker视图
在使用SpringMVC处理FreeMarker的时候,出现了无法解析视图名的问题,报的异常说明的也非常清楚就是不能解析视图 这个free就是一个FreeMarker的模板名,它的完整路径是/WEB- ...
- Python 常用 PEP8 编码规范和建议
代码布局 缩进 每级缩进用4个空格. 括号中使用垂直隐式缩进或使用悬挂缩进. EXAMPLE: # (垂直隐式缩进)对准左括号 foo = long_function_name(var_one, va ...
- canvas设置渐变
canvas设置渐变 方法 createLinearGradient(x1, y1, x2, y2) 线性渐变 createRadialGradient(x1, y1, r1, x2, y2, r2) ...
- Servlet讲解
第1章 Servlet的生命周期 1.1.1 Servlet的生命周期概述 1.1.1.1 什么是生命周期 生命周期:一个对象从创建到销毁过程. 1.1.1.2 Servlet的生命周期(*****) ...
- 设置myeclipse文件的打开格式