UILabel的默认行为是防止孤立词单独出现在单独的行中。例如:如果自动换行碰巧在最后一行只保留了一个单词,iOS将通过发送前一行的一个单词来防止这种情况,在最后一行有两个单词。
问题是NSMutableAttributedString
默认情况下不支持此功能。如何启用它?
样品:
var string = customField?.title ?? ""
if customField?.required == true {
string += " *"
} else {
string += " (\(getLocalizedString(localizedKey: .optional)))"
}
let style = NSMutableParagraphStyle()
if #available(iOS 14.0, *) {
style.lineBreakStrategy = .standard
}
let att = NSMutableAttributedString(string: string, attributes: [.paragraphStyle: style])
titleLabel.attributedText = att
请记住,我被迫使用NSMutableAttributedString
的其他原因。2标签不会为我工作。
3条答案
按热度按时间q35jwt9p1#
根据OP的评论...
问题不在于属性化文本,因为“普通”文本也会发生同样的情况。
在iOS 11(可能是10)中,Apple更改了UIKit,以防止
UILabel
换行到***两行文本***时出现孤立。超过两行时仍允许出现孤立:A
是iOS 11之前的版本...B
是当前版本...C
是当前版本,有两条以上的线路...请注意
D
示例--我没有安装Xcode测试版,但根据我看到的其他评论,在iOS 16中,当文本换行超过两行时,“无孤儿”规则也将适用。所以......解决问题的一个方法是在最后一个单词和星号之间使用“非空格”字符(而不是普通空格)。
下面是一个快速测试:
输出量:
所以......你会想在iOS 16上测试一下,如果是这样的话,你可能需要做一个版本检查,以确定是添加一个普通空格还是一个非间断空格。
llew8vvj2#
来自
UILabel
上thelineBreakStrategy
property的文档,它有助于控制此行为:当标签具有属性化字符串值时,系统将忽略
textColor
、font
、textAlignment
、lineBreakMode
和lineBreakStrategy
属性。请改为在属性化字符串中设置NSForegroundColorAttributeName
、NSFontAttributeName
、alignment
、lineBreakMode
和lineBreakStrategy
属性。如果您想要使用特定的分行策略,例如
.standard
(“文字系统使用与标准UI标签相同的分行策略组态。”),您将需要透过段落样式将属性套用至属性化字串:根据您的文本,在段落样式上设置
allowsDefaultTighteningForTruncation
* 可能 * 也会有所帮助,因为这可能允许文本系统在字符串的最后一行收紧单词之间的间距,以使所有内容都适合。(我说 * 可能 * 是因为该属性专门控制截断,但文本系统也可能在换行时考虑到这一点。)q1qsirdb3#
这是苹果自iOS 11以来的一个变化(由@DonMag回答),以防止最后一行出现孤立词。
如果您的制作只支持iOS13.0+,设置lineBreakStrategy将把它设置回旧样式。
(One有趣的是,我发现这个lineBreakStrategy也适用于iOS 13. 0+,即使从Apple's document它提到了iOS 14. 0+。)
如果你需要支持旧的iOS版本,你需要设置
NSAllowsDefaultLineBreakStrategy
键的值时,应用程序启动,我找不到任何文件关于它.我测试它在iOS 11 & 12工作,但在iOS 13.0+.所以如果你的应用程序支持iOS 11. 0+,你可能需要这两个。希望它能有所帮助;)