2016-06-12 61 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

相关问题