获取给定宽度下的一段文字的行数以及每行的内容

220 阅读1分钟

 func getaLineAllStrings(textWidth:CGFloat,textFont:UIFont,lineSpacing:CGFloat,paragraphSpacing:CGFloat,lineBreakMode:NSLineBreakMode) -> [String] {
        var paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = lineSpacing
        paragraphStyle.paragraphSpacing = paragraphSpacing
        paragraphStyle.lineBreakMode = lineBreakMode
        paragraphStyle.alignment = .justified //左右对齐方式
        var attributeStr = NSMutableAttributedString(string: self)
        attributeStr.addAttribute(.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: self.count))
        attributeStr.addAttribute(.font, value: textFont, range: NSRange(location: 0, length: self.count))
        var frameSetter: CTFramesetter? = nil
        if let str = attributeStr as? CFAttributedString {
            frameSetter = CTFramesetterCreateWithAttributedString(str)
        }
        let path = CGMutablePath()
        path.addRect(CGRect(x: 0, y: 0, width: textWidth, height: CGFloat.greatestFiniteMagnitude), transform: .identity)
        var frame: CTFrame? = nil
        if let frameSetter = frameSetter {
            frame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(CFIndex(0), CFIndex(0)), path, nil)
            }
        let lines = CTFrameGetLines(frame!) as? [AnyHashable]
            var linesArray: [String] = []
            for line in lines ?? [] {
                let lineRef = line as! CTLine
                var lineRange: CFRange? = nil
                    lineRange = CTLineGetStringRange(lineRef)
                let range = NSRange(location: lineRange?.location ?? 0, length: lineRange?.length ?? 0)
                    let indexStart = self.index(self.startIndex, offsetBy: range.location)
                let indexEnd = self.index(self.startIndex, offsetBy:(range.location + range.length),limitedBy: self.endIndex)!                let lineString = self[indexStart ..< indexEnd]                linesArray.append(String(lineString))
            }           return linesArray
        
    }