通過一些計算,您可以獲得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)
因此,首先添加這些擴展:
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)")
非常感謝您! – Dim