iOS 11中UILabel错误的自动换行

时间:2017-09-13 14:21:18

标签: ios iphone uilabel ios11

我在没有自动布局的情况下使用XIB的应用程序有问题。我不知道这是否是重要信息。

我有UILabel有两行使用自动换行。在iOS 10中,自动换行正常工作,第一行包含一个单词+特殊字符,例如&符号。例如:

UiLabel on ios 10

然后在iOS 11上,自动换行错误并将放大器放到第二行:

UiLabel on ios 11

这是有问题的,因为通常在第二行上安装的较长的单词现在没有正确显示。知道改变了什么吗?我知道safeArea但它看起来并不合理。任何想法如何将该&符号移到顶部哪里有足够的空间呢?

其余设置:size inspector

8 个答案:

答案 0 :(得分:45)

这很可能是Apple故意改变以防止丧偶的线路。从设计角度来看,最好避免在一行文本上使用单个单词。所以UILabel现在似乎打破了这条线,第二行文字总是至少有两个单词。

令人惊讶的是,没有文档或方法来禁用此行为。

enter image description here

此处a good article关于"丧偶"和"孤儿"文本。

答案 1 :(得分:16)

使用参数-NSAllowsDefaultLineBreakStrategy NO启动应用程序(未记录的默认设置)似乎强制回到旧行为。或者,您可以在NSAllowsDefaultLineBreakStrategy启动时将NO设置为NSUserDefaults(当YES或字符串绘图代码为时,Apple会为该值注册默认值UILabel初始化,看起来,所以你需要在那之后注册一个覆盖值,或者将其插入NSArgumentDomain,或者只是持久地设置默认值。

Apple可能会考虑私有API并拒绝使用它的应用程序;我不确定。我没有在运送应用程序中尝试这个。但是,它确实可以用于快速测试 - 查看NSUserDefaults中的设置并发现更改它会改变行为。

答案 2 :(得分:10)

这不是一个真正的答案,但我想补充说明一般问题是什么,与&符号无关。

two UILabels

这两个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. "(请注意字符串末尾的两个额外空格)

明显的缺点是,如果这些多余的空格自己被迫换行,但对于像标题这样的简单内容来说就足够了。