2016-06-12 66 views
1

如何從按鈕中的第一和第二行中獲取文本?我怎麼能得到按鈕標題中有多少行?如何從按鈕中的第一和第二行標題中獲取文本

我創建了一個按鈕:

let button = UIButton(type: UIButtonType.Custom) as UIButton 
button.frame = CGRectMake(15, 30, 150, 30) 
button.setTitle(title, forState: .Normal) 
button.titleLabel?.adjustsFontSizeToFitWidth = true 
button.titleLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping; 

然後我想要得到的按鈕有多少行用於顯示標題。我想獲得按鈕標題第一行的文本。

回答

1

通過一些計算,您可以獲得UIButton標題的行數並獲取第一行字符串。 我想創造一些擴展,使代碼 「最輕便」

與您的代碼開始:

let button = UIButton(type: UIButtonType.Custom) as UIButton 
let title = "Lorem ipsum dolor sit amet, legimus tacimates eam in. Inani petentium iudicabit nam ut, verear nostrud in sea. Everti repudiare comprehensam et has" 
button.frame = CGRectMake(15, 150, 150, 30) 
button.setTitle(title, forState: .Normal) 
button.titleLabel?.adjustsFontSizeToFitWidth = true 
button.setTitleColor(UIColor.blackColor(), forState: UIControlState.Normal) 
button.titleLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping 
self.view.addSubview(button) 

enter image description here

因此,首先添加這些擴展

extension UIFont { 
    func sizeOfString(string:String) -> CGSize { 
     return (string as NSString).sizeWithAttributes([NSFontAttributeName:self]) 
    } 
    func sizeOfStringConstrained(string: String, constrainedToWidth width: Double) -> CGSize { 
     return NSString(string: string).boundingRectWithSize(CGSize(width: width, height: DBL_MAX), 
                  options: NSStringDrawingOptions.UsesLineFragmentOrigin, 
                  attributes: [NSFontAttributeName: self], 
                  context: nil).size 
    } 
} 

extension UIButton { 
    func getLinesArrayOfString() -> [String] { 

     let text:NSString = (self.titleLabel?.text)! 
     let font:UIFont = self.titleLabel!.font 
     let rect:CGRect = self.frame 

     let myFont:CTFontRef = CTFontCreateWithName(font.fontName, font.pointSize, nil) 
     let attStr:NSMutableAttributedString = NSMutableAttributedString(string: text as String) 
     attStr.addAttribute(String(kCTFontAttributeName), value:myFont, range: NSMakeRange(0, attStr.length)) 
     let frameSetter:CTFramesetterRef = CTFramesetterCreateWithAttributedString(attStr as CFAttributedStringRef) 
     let path:CGMutablePathRef = CGPathCreateMutable() 
     CGPathAddRect(path, nil, CGRectMake(0, 0, rect.size.width, 100000)) 
     let frame:CTFrameRef = 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.substringWithRange(range) 
      linesArray.append(lineString as String) 
     } 
     return linesArray 
    } 
} 

然後,寫代碼才能獲得結果

let font = button.titleLabel?.font 
let sizeString = font?.sizeOfString(title) 
let sizeStringConstrained = font?.sizeOfStringConstrained(title, constrainedToWidth: Double(button.frame.width)) 
let division = (sizeStringConstrained?.height)!/(sizeString?.height)! 
let numLines = Int(ceil(division)) 
print("Number of lines used in my button title: \(numLines)") 

let array = button.getLinesArrayOfString() 
print("The first line of my button title is: \(array.first)") 

enter image description here

+1

非常感謝您! – Dim

相關問題