我有一个可以有一两行的标签。如果它有两行,我希望第二行至少有两个(或者三个)单词,而不是一个单词。关于如何使用swift实现这一点的任何想法?
提前致谢!
丹尼尔
编辑:我编辑了我愚蠢的初步想法,这些想法并没有真正帮助。
答案 0 :(得分:1)
好的,经过四处寻找,我想出了我认为最好的解决方案。
我写了这个函数:
func numberOfLinesInLabelForText(text: String) -> Int {
let attributes = [NSFontAttributeName : UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline)]
let screenSize: CGRect = UIScreen.mainScreen().bounds
let labelSize = text!.boundingRectWithSize(CGSizeMake((screenSize.width - 30), CGFloat.max), options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: attributes, context: nil)
let lines = floor(CGFloat(labelSize.height) / bookTitleLabel.font.lineHeight)
return Int(lines)
}
您输入将在标签中显示的字符串,它会显示标签将包含的行数。我正在为此特定标签使用动态类型和标题样式,因此preferredFontForTextStyle(UIFontTextStyleHeadline)
部分,但您可以将其更改为标签使用的字体和大小。
然后我使用(screenSize.width - 30)
作为我的标签的宽度,因为它的宽度不固定,所以我使用屏幕尺寸减去前导和尾随。这可能不是最优雅的解决方案,我愿意接受更好的建议。
其余的很简单。
在我拥有行数后,我可以这样做:
func splittedString(text: String) -> String {
if numberOfLinesInLabel(text) == 2 {
var chars = Array(text.characters)
var i = chars.count / 2
var x = chars.count / 2
while chars[i] != " " && chars[x] != " " {
i--
x++
}
if chars[i] == " " {
chars.insert("\n", atIndex: i+1)
} else {
chars.insert("\n", atIndex: x+1)
}
return String(chars)
}
}
我决定将字符串拆分为最接近其一半的断点,而不是仅仅避开孤儿,这就是最后一个函数的作用,但要根据您的需要进行调整并不困难。
你有它!