实用小技巧(二十八)—— 一种字符串的遍历方式

版本记录

版本号 时间
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

后记

未完,待续

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容