iOS获取UILabel中的第一个属性行

时间:2017-12-11 06:37:58

标签: ios uilabel nsattributedstring

我在我的标签中设置了这样的属性文本。

self.lblContent.attributedText = .......; 

我也知道我的标签的宽度和高度。我需要检索该标签中的第一行,并且必须采用归因格式。我怎样才能得到?

2 个答案:

答案 0 :(得分:1)

Swift 3

 let arrayLines = getLinesArrayFromLabel(label: lbl)
 print(arrayLines[0])

 func getLinesArrayFromLabel(label:UILabel) -> [String] {

        let text:NSString = label.text! as NSString // TODO: Make safe?
        let font:UIFont = label.font
        let rect:CGRect = label.frame

        let myFont:CTFont = CTFontCreateWithName(font.fontName as CFString, font.pointSize, nil)
        let attStr:NSMutableAttributedString = NSMutableAttributedString(string: text as String)
        attStr.addAttribute(String(kCTFontAttributeName), value:myFont, range: NSMakeRange(0, attStr.length))
        let frameSetter:CTFramesetter = CTFramesetterCreateWithAttributedString(attStr as CFAttributedString)
        let path:CGMutablePath = CGMutablePath()
        path.addRect(CGRect(x:0, y:0, width:rect.size.width, height:100000))

        let frame:CTFrame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, 0), path, nil)
        let lines = CTFrameGetLines(frame) as NSArray
        var linesArray = [String]()

        for line in lines {
            let lineRange = CTLineGetStringRange(line as! CTLine)
            let range:NSRange = NSMakeRange(lineRange.location, lineRange.length)
            let lineString = text.substring(with: range)
            linesArray.append(lineString as String)
        }
        return linesArray
}

<强> NSAttributedString

func getLinesArrayOfStringInLabel(label:UILabel) -> [NSAttributedString] {

    let text:NSAttributedString = label.attributedText!  // TODO: Make safe?
    let font:UIFont = label.font
    let rect:CGRect = label.frame

    let myFont:CTFont = CTFontCreateWithName(font.fontName as CFString, font.pointSize, nil)
    let attStr:NSMutableAttributedString = NSMutableAttributedString(attributedString: text)
    attStr.addAttribute(String(kCTFontAttributeName), value:myFont, range: NSMakeRange(0, attStr.length))
    let frameSetter:CTFramesetter = CTFramesetterCreateWithAttributedString(attStr as CFAttributedString)
    let path:CGMutablePath = CGMutablePath()
    path.addRect(CGRect(x:0, y:0, width:rect.size.width, height:100000))

    let frame:CTFrame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, 0), path, nil)
    let lines = CTFrameGetLines(frame) as NSArray
    var linesArray = [NSAttributedString]()

    for line in lines {
        let lineRange = CTLineGetStringRange(line as! CTLine)
        let range:NSRange = NSMakeRange(lineRange.location, lineRange.length)
        let lineString = text.attributedSubstring(from: range)
        linesArray.append(lineString)
    }
    return linesArray
}

答案 1 :(得分:0)

删除force_cast

    for case let line as CTLine in lines {
        let lineRange = CTLineGetStringRange(line)
        let range = NSRange(location: lineRange.location, length: lineRange.length)
        let lineString = (text as NSString).substring(with: range)
        linesArray.append(lineString)
    }