如何防止 swift 中的标签中出现孤儿?
How can I prevent orphans in a label in swift?
我有一个可以有一行或两行的标签。如果它有两行,我希望第二行至少有两个(或三个)单词,而不仅仅是一个。关于如何使用 swift 完成此操作的任何想法?
提前致谢!
丹尼尔
编辑:我删除了我愚蠢的第一个想法,这些想法并没有真正帮助。
好的,在四处寻找之后,我想出了我认为最好的解决方案。
我写了这个函数:
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)
}
}
我决定在最接近其一半的断点处将字符串一分为二,而不是仅仅避免孤儿,这就是最后一个函数所做的,但调整它以满足您的需要并不难。
给你!
我有一个可以有一行或两行的标签。如果它有两行,我希望第二行至少有两个(或三个)单词,而不仅仅是一个。关于如何使用 swift 完成此操作的任何想法?
提前致谢!
丹尼尔
编辑:我删除了我愚蠢的第一个想法,这些想法并没有真正帮助。
好的,在四处寻找之后,我想出了我认为最好的解决方案。
我写了这个函数:
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)
}
}
我决定在最接近其一半的断点处将字符串一分为二,而不是仅仅避免孤儿,这就是最后一个函数所做的,但调整它以满足您的需要并不难。
给你!