iOS获取UILabel每行文字

public extension UILabel {
    
    public func getLinesArrayOfStringWidth(_ width: CGFloat) -> [String]? {
        
        guard let str = text, str.isEmpty == false, let font = font else {
            return nil
        }
        
        var linesArr = [String]()
        
        let myFont = CTFontCreateWithName(font.fontName as CFString, font.pointSize, nil)
        
        let attStr = NSMutableAttributedString(string: str)
        
        let paragraphStyle = NSMutableParagraphStyle()
        
        paragraphStyle.lineBreakMode = .byCharWrapping
        
        attStr.addAttribute(NSAttributedString.Key.paragraphStyle, value: paragraphStyle, range: NSMakeRange(0, str.count))
        attStr.addAttribute( NSAttributedString.Key(kCTFontAttributeName as String), value: myFont, range: NSMakeRange(0, str.count))
        
        let frameSetter = CTFramesetterCreateWithAttributedString(attStr)
        
        let path = CGMutablePath()
        
        path.addRect(CGRect(x: 0, y: 0, width: width, height: 10000))
        
        let frame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, 0), path, nil)
        
        if let lines = CTFrameGetLines(frame) as? [CTLine] {
            lines.forEach { (line: CTLine) in
                let lineRange = CTLineGetStringRange(line)
                
                let lineStr = (str as NSString).substring(with: NSMakeRange(lineRange.location, lineRange.length))
                
                CFAttributedStringSetAttribute(attStr, lineRange, kCTKernAttributeName, NSNumber(value: 0) as CFTypeRef)
                CFAttributedStringSetAttribute(attStr, lineRange, kCTKernAttributeName, NSNumber(value: 0) as CFTypeRef)
                
                linesArr.append(lineStr)
            }
        }
        
        return linesArr
    }
    
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容