版本记录
版本号 | 时间 |
---|---|
V1.0 | 2017.11.22 |
前言
在app中,很多时候都需要熟悉一些小技巧让您事半功倍,提高工作效率,这些小技巧都很小很细。感兴趣的可以看看我写的其他小技巧。
1. 实用小技巧(一):UIScrollView中上下左右滚动方向的判断
2. 实用小技巧(二):屏幕横竖屏的判断和相关逻辑
3.实用小技巧(三):点击手势屏蔽子视图的响应
4.实用小技巧(四):动态的增删标签视图
5.实用小技巧(五):通过相册或者相机更改图标
6.实用小技巧(六):打印ios里所有字体
7. 实用小技巧(七):UITableViewCell自适应行高的计算
8. 实用小技巧(八):数字余额显示的分隔
9.实用小技巧(九):类头条模糊背景的实现
10.实用小技巧(十):晃动手机换后台服务器网络
11.实用小技巧(十一):scrollView及其子类显示的一些异常处理
12.实用小技巧(十二):头像图片缩放以及保存到相册简单功能的实现
13.实用小技巧(十三):一种类酷我音乐盒动画实现
14.实用小技巧(十四):生成跳往applestore指定app的方法
15.实用小技巧(十五):左侧向右滑动返回上一级控制器
16.实用小技巧(十六):获取设备信息
17.实用小技巧(十七):清除缓存目录
18.实用小技巧(十八):取出gif图的每一帧
19.实用小技巧(十九):获取相机和麦克风权限
20.实用小技巧(二十):游客模式的实现
21.实用小技巧(二十一):版本检测的实现
22.实用小技巧(二十二):键盘遮挡问题
23. 实用小技巧(二十三):获取闪光灯的控制
24. 实用小技巧(二十四):APP页面开启跳转逻辑处理
25. 实用小技巧(二十五)—— 关于UILabel控件宽高的计算
26. 实用小技巧(二十六)—— APP中各种权限监测和申请工具封装
27. 实用小技巧(二十七)—— 控制器跳转逻辑的封装
功能需求
要求可以对字符串进行遍历,并将其分解为数组中的每一个元素。
功能实现
大家知道,字符串可以用enumerate
方法进行遍历,下面我们看另外一种遍历的方式。还是直接看代码。
在写代码之前要引入CoreText框架。
#import <CoreText/CoreText.h>
看详细代码。
#import "ViewController.h"
#import <CoreText/CoreText.h>
@interface ViewController ()
@end
@implementation ViewController
#pragma mark - Override Base Function
- (void)viewDidLoad
{
[super viewDidLoad];
UILabel *label = [[UILabel alloc] init];
label.text = @"我是一只小小鸟🐦niao!";
NSArray *stringArr = [self getStringArrFromLabel:label];
NSLog(@"数组是 = %@", stringArr);
}
#pragma mark - Object Private Function
- (NSArray *)getStringArrFromLabel:(UILabel *)label
{
if (!label.text) {
label.text = @"";
}
NSString *text = [label text];
UIFont *font = [label font];
CGRect rect = [label frame];
CTFontRef myFont = CTFontCreateWithName((__bridge CFStringRef)([font fontName]), [font pointSize], NULL);
NSMutableAttributedString *attStr = [[NSMutableAttributedString alloc] initWithString:text];
[attStr addAttribute:(NSString *)kCTFontAttributeName value:(__bridge_transfer id)myFont range:NSMakeRange(0, attStr.length)];
CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)attStr);
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, CGRectMake(0,0,rect.size.width,100000));
CTFrameRef frame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, 0), path, NULL);
if (frameSetter) {
CFRelease(frameSetter);
}
if (path) {
CFRelease(path);
}
NSArray *lines = (__bridge NSArray *)CTFrameGetLines(frame);
NSMutableArray *linesArray = [[NSMutableArray alloc]init];
if (frame) {
CFRelease(frame);
}
for (id line in lines)
{
CTLineRef lineRef = (__bridge CTLineRef )line;
CFRange lineRange = CTLineGetStringRange(lineRef);
NSRange range = NSMakeRange(lineRange.location, lineRange.length);
NSString *lineString = [text substringWithRange:range];
[linesArray addObject:lineString];
}
return (NSArray *)linesArray;
}
@end
下面我们看输出结果
2017-11-22 21:38:23.536399+0800 JJStringEnumerate[1033:14545] 数组是 = (
"\U6211",
"\U662f",
"\U4e00",
"\U53ea",
"\U5c0f",
"\U5c0f",
"\U9e1f",
"\Ud83d\Udc26",
n,
i,
a,
o,
"\Uff01"
)
根据输出结果,我们可以看到,字符串的每一个单元字符或者文字都被遍历出来了,并存在一个不可变数组中,打印出来也完全正确。代码已经上传至刀客传奇 - GitHub。
后记
未完,待续