当前位置: 首页 > news >正文

Swift实现菜单的多选

问题

在Objective-C里,enum是可以多选的。如:


NSString* string = @"一段文字"; CGRect boundingRect = [string boundingRectWithSize:CGSizeMake(label.frame.width, CGFloat.max) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attributes context:nil];


把两个enum值用 | 或起来,就能达到多选的效果。


现在的问题是:在swift里,如何实现相同的效果呢?

Swift中的option类型

Swift的enum不支持多选,所以能够多选的option类型应该用struct : RawOptionSet 来实现。要自己实现options类型,可以参考 这个答案 。

官方的SDK正是采取这种方法移植的。

正确的写法

以上例子中的代码,用swift正确的写法如下:


let options : NSStringDrawingOptions = .UsesLineFragmentOrigin | .UsesFontLeading let boundingRect = string.bridgeToObjectiveC().boundingRectWithSize(CGSizeMake(label.frame.width, CGFloat.max), options: options, attributes: attributes, context: nil)


在OS X 10.10中这样写就可以了。


iOS SDK 的 bug

但在目前版本的iOS 8 SDK中,这样的写法编译通不过。这是在iOS 8的SDK里,NSStringDrawingOptions被移植为了 enum : Int ,而不是struct : RawOptionSet 。

如何解决这个问题呢?只能借用下OC来workaround了。

解决方案

因为用到的options都相同,我只是简单地写了这个类:

OCUtils.h

@interface OCUtils : NSObject + (NSStringDrawingOptions)stringDrawingOptions; @end

OCUtils.m

#import "OCUtils.h" @implementation OCUtils + (NSStringDrawingOptions)stringDrawingOptions{ return NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading; } @end

在Bridging-Header.h中加上:

#import "OCUtils.h"
用到的swift文件

let boundingRect = string.bridgeToObjectiveC().boundingRectWithSize(CGSizeMake(label.frame.width, CGFloat.max), options: OCUtils.stringDrawingOptions(), attributes: attributes, context: nil)

如果有进一步的需求,可以改得更通用一些。总体原理只能这样了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/devZhou/p/4872692.html

相关文章:

  • 预防缓存击穿-布隆过滤器
  • Windows下PyQt4的安装
  • jsplumb 使用总结
  • PHP判断变量是否存在及函数isset() 、empty()与is_null的区别
  • [mysql]错误解决之Failed to start MySQL Server
  • CSS3 calc的用法详解
  • MySQL主从复制虽好,能完美解决数据库单点问题吗?
  • 声明25个长度的数组,通过键盘录入学生成绩,并把每个元素赋值为学生的分数成绩,输出结束后遍历输出。...
  • 妈妈走开一会儿
  • 需求的重要性续集
  • 《人月神话》2
  • 7年间减少4000万劳动力,中国企业该何去何从?
  • php图片转base64并保存为文本
  • B 站后端源码被恶意“开源” 6 小时,如何保证后台的安全!
  • bitbucket的使用方法
  • 《深入 React 技术栈》
  • 【EOS】Cleos基础
  • AngularJS指令开发(1)——参数详解
  • ES6语法详解(一)
  • express如何解决request entity too large问题
  • HashMap ConcurrentHashMap
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • LeetCode算法系列_0891_子序列宽度之和
  • Linux链接文件
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • V4L2视频输入框架概述
  • windows-nginx-https-本地配置
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 每天一个设计模式之命令模式
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 小程序开发中的那些坑
  • 用element的upload组件实现多图片上传和压缩
  • 国内开源镜像站点
  • ​马来语翻译中文去哪比较好?
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (1)STL算法之遍历容器
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (搬运以学习)flask 上下文的实现
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (论文阅读40-45)图像描述1
  • (三十五)大数据实战——Superset可视化平台搭建
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • ?php echo ?,?php echo Hello world!;?
  • @html.ActionLink的几种参数格式
  • @WebService和@WebMethod注解的用法
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)