iOS 11中UILabel错误的自动换行

stu*_*tbi 40 iphone uilabel ios ios11

我有使用XIB而没有自动布局的应用程序的问题.我不知道这是否是重要信息.

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

UiLabel on ios 10

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

UiLabel on ios 11

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

其余设置: 尺寸检查员

bry*_*yle 52

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

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

在此输入图像描述

这里还有一篇关于"丧偶"和"孤儿" 文章的好文章.

  • 经过测试,我可以得出结论,iOS 11 确实会用孤立词来拉取额外的词。 (2认同)

Car*_*erg 20

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

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

  • 这确实适用于 `UserDefaults.standard.set(false, forKey: "NSAllowsDefaultLineBreakStrategy")`。有人在运输应用程序中使用过这个吗?Apple是否拒绝了? (2认同)

Kar*_*lis 12

从 iOS 14 开始,您可以使用实例lineBreakStrategy属性UILabel来控制此行为。

可用值为:

NSParagraphStyle.LineBreakStrategy() // none
NSParagraphStyle.LineBreakStrategy.pushOut
NSParagraphStyle.LineBreakStrategy.hangulWordPriority
NSParagraphStyle.LineBreakStrategy.standard
Run Code Online (Sandbox Code Playgroud)

要使用 Swift禁用此行为:

if #available(iOS 14.0, *) {
    label.lineBreakStrategy = []
}

// Alternatives
// label.lineBreakStrategy = NSParagraphStyle.LineBreakStrategy()
// label.lineBreakStrategy = .init(rawValue: 0)
// label.lineBreakStrategy = .init()
Run Code Online (Sandbox Code Playgroud)

目标-C:

if (@available(iOS 14.0, *)) {
    label.lineBreakStrategy = NSLineBreakStrategyNone;
}
Run Code Online (Sandbox Code Playgroud)

  • 不要将其设置为 None(或 Swift 中的 [])。这将删除其他值,例如您可能需要的韩文设置(以及 Apple 将来默认添加的任何其他值)。我会在 ObjC 中执行 ```label.lineBreakStrategy &= ~NSLineBreakStrategyPushOut;``` ,在 Swift 中执行 ```label.lineBreakStrategy.remove(.pushOut)``` 。 (5认同)
  • 非常感谢您发布此内容!(奇怪的是 Objective-C 版本的可读性要高得多!) (2认同)
  • @DavidDunham 我知道对吧?为什么 swift 没有 LineBreakStrategy.none ?在某些方面,Swift 可能非常不直观,而且它的目标受众是年幼的孩子,目的是让他们开始编码…… (2认同)
  • 这应该是公认的答案。 (2认同)

Dav*_*ham 10

这不是一个真正的答案,但我想补充说明这是一个普遍的问题,而不是与&符号有关.

两个UILabels

这两个UILabel都具有相同的宽度约束,并且文本几乎相同.但是第二个包含了我期望的词汇.第一个是不正确的,"约"可以清楚地保留在第一行.