我在没有自动布局的情况下使用XIB的应用程序有问题。我不知道这是否是重要信息。
我有UILabel有两行使用自动换行。在iOS 10中,自动换行正常工作,第一行包含一个单词+特殊字符,例如&符号。例如:
然后在iOS 11上,自动换行错误并将放大器放到第二行:
这是有问题的,因为通常在第二行上安装的较长的单词现在没有正确显示。知道改变了什么吗?我知道safeArea但它看起来并不合理。任何想法如何将该&符号移到顶部哪里有足够的空间呢?
答案 0 :(得分:45)
这很可能是Apple故意改变以防止丧偶的线路。从设计角度来看,最好避免在一行文本上使用单个单词。所以UILabel现在似乎打破了这条线,第二行文字总是至少有两个单词。
令人惊讶的是,没有文档或方法来禁用此行为。
此处a good article关于"丧偶"和"孤儿"文本。
答案 1 :(得分:16)
使用参数-NSAllowsDefaultLineBreakStrategy NO
启动应用程序(未记录的默认设置)似乎强制回到旧行为。或者,您可以在NSAllowsDefaultLineBreakStrategy
启动时将NO
设置为NSUserDefaults
(当YES
或字符串绘图代码为时,Apple会为该值注册默认值UILabel
初始化,看起来,所以你需要在那之后注册一个覆盖值,或者将其插入NSArgumentDomain
,或者只是持久地设置默认值。
Apple可能会考虑私有API并拒绝使用它的应用程序;我不确定。我没有在运送应用程序中尝试这个。但是,它确实可以用于快速测试 - 查看NSUserDefaults
中的设置并发现更改它会改变行为。
答案 2 :(得分:10)
这不是一个真正的答案,但我想补充说明一般问题是什么,与&符号无关。
这两个UILabel具有相同的宽度约束,文本几乎相同。但是第二个包含了我期望的词汇。第一个是不正确的,“约”可以清楚地保留在第一行。
答案 3 :(得分:3)
从iOS 14开始,您可以使用lineBreakStrategy
实例的UILabel
属性来控制此行为。
可用值是:
NSParagraphStyle.LineBreakStrategy() // none
NSParagraphStyle.LineBreakStrategy.pushOut
NSParagraphStyle.LineBreakStrategy.hangulWordPriority
NSParagraphStyle.LineBreakStrategy.standard
使用Swift 禁用此行为:
if #available(iOS 14.0, *) {
label.lineBreakStrategy = .init()
}
// Alternatives
// label.lineBreakStrategy = NSParagraphStyle.LineBreakStrategy()
// label.lineBreakStrategy = .init(rawValue: 0)
Objective-C:
if (@available(iOS 14.0, *)) {
label.lineBreakStrategy = NSLineBreakStrategyNone;
}
答案 4 :(得分:1)
似乎用不间断的空间(U + 00A0)替换前后的空格使得&符号保持在同一条线上。根据您为标签生成文本的方式,这可能不容易自动化(在某些情况下,您可能确实需要将&符号放在第二行)。
答案 5 :(得分:1)
一个选项可能是使用UITextView - 似乎没有这种行为。如果将NSTextContainer.lineFragmentPadding设置为0,将TextContainerInset设置为UIEdgeInsetsZero,并关闭所有滚动(scrollEnabled,弹跳,滚动指示器等),它将显示与UILabel类似,但不具有约束灵活性。它不是替代品,但在某些情况下它是可以接受的。
答案 6 :(得分:1)
有点麻烦,但是您可以在字符串的末尾添加一些零宽度的空格以恢复旧的行为,而不会影响字符串的布局,否则您会从普通空格中得到
let zeroWidthSpace: Character = "\u{200B}"
let spacingForWordWrapping = String(repeating: zeroWidthSpace, count: 6)
label.text = "oneText & two" + spacingForWordWrapping
答案 7 :(得分:0)
作为一种简单的(变通方法)解决方法,通常可以通过在文本末尾添加空格来使用UILabel获得正确的行为。以您的示例为例:
包装新的(不需要的)方法:
"oneText & two."
以旧方式包装:
"oneText & two. "
(请注意字符串末尾的两个额外空格)
明显的缺点是,如果这些多余的空格自己被迫换行,但对于像标题这样的简单内容来说就足够了。