美文网首页
iOS使用核心文本将字符串切割为字符串数组

iOS使用核心文本将字符串切割为字符串数组

作者: 季末微夏 | 来源:发表于2018-12-29 15:58 被阅读22次

    前言

    开发中某些情况下,会遇到一些特殊要求,比如需要将一段文本按照固定宽度分割成字符串数组,这里提供一段使用核心文本切割字符串的方法。

    Swift代码

    import UIKit
    extension String {
        ///根据字体和宽度切割字符串
        func separatedLines(with font: UIFont, width: CGFloat) -> [String] {
            let attributedString = NSMutableAttributedString(string: self)
            attributedString.addAttribute(NSAttributedString.Key(kCTFontAttributeName as String), value: CTFontCreateWithName((font.fontName) as CFString, font.pointSize, nil), range: NSRange(location: 0, length: attributedString.length))
            let frameSetter = CTFramesetterCreateWithAttributedString(attributedString)
            let path = CGMutablePath()
            path.addRect(CGRect(x: 0, y: 0, width: width, height: 100000), transform: .identity)
            let frame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, 0), path, nil)
            let lines = CTFrameGetLines(frame)
            var linesArray: [String] = []
            for line in (lines as Array) {
                let lineRef = line as! CTLine
                let lineRange: CFRange = CTLineGetStringRange(lineRef)
                let range = NSRange(location: lineRange.location, length: lineRange.length)
                let lineString = (self as NSString).substring(with: range)
                linesArray.append(lineString)
            }
            return linesArray
        }
    }
    

    OC代码

    #import <UIKit/UIKit.h>
    #import "NSString+Separated.h"
    #import <CoreText/CoreText.h>
    @implementation NSString (Separated)
    /**
     根据字体和每一行宽度切割字符串
     
     @param font 字体
     @param width 宽度
     @return 切割后字符串数组
     */
    - (NSArray *)separatedLinesWithFont:(UIFont *)font width:(CGFloat)width {
        NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:self];
        [attributedString addAttribute:(NSString *)kCTFontAttributeName value:(__bridge id)CTFontCreateWithName((__bridge CFStringRef)([font fontName]), [font pointSize], NULL) range:NSMakeRange(0, attributedString.length)];
        CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)attributedString);
        CGMutablePathRef path = CGPathCreateMutable();
        CGPathAddRect(path, NULL, CGRectMake(0, 0, width, 100000));
        CTFrameRef frame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, 0), path, NULL);
        NSArray *lines = (__bridge NSArray *)CTFrameGetLines(frame);
        NSMutableArray *linesArray = [[NSMutableArray alloc]init];
        for (id line in lines) {
            CTLineRef lineRef = (__bridge CTLineRef )line;
            CFRange lineRange = CTLineGetStringRange(lineRef);
            NSRange range = NSMakeRange(lineRange.location, lineRange.length);
            NSString *lineString = [self substringWithRange:range];
            [linesArray addObject:lineString];
        }
        return (NSArray *)linesArray;
    }
    
    @end
    
    

    切割效果

    相关文章

      网友评论

          本文标题:iOS使用核心文本将字符串切割为字符串数组

          本文链接:https://www.haomeiwen.com/subject/qbqplqtx.html