1

I have set attributed text in my label like this.

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

I know width and height of my label also. I need to retrieve my first line in that label and it has to be in attributed format. How can I get?

Khant Thu Linn
  • 5,905
  • 7
  • 52
  • 120

2 Answers2

3

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
}
Harshal Valanda
  • 5,331
  • 26
  • 63
0

Removing 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)
    }
dogo
  • 183
  • 1
  • 1
  • 8