【问题标题】:Swift 3 NSMutableParagraphStyle : NSLineBreakMode.byWordWrapping keep breaking the wordsSwift 3 NSMutableParagraphStyle:NSLineBreakMode.byWordWrapping 不断打破单词
【发布时间】:2018-01-23 23:56:03
【问题描述】:

我有一个应用于 NSMutableAttributedString 的 NSMutableParagraphStyle 样式:

import UIKit
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let myString = "Before a telephone call, I need to go to the bathroom..."
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineBreakMode = NSLineBreakMode.byWordWrapping
        let myMutableString = NSMutableAttributedString(
            string: myString,
            attributes: [
                NSFontAttributeName:UIFont(
                    name: "Georgia",
                    size: 45.0
                    )!,
                NSParagraphStyleAttributeName: paragraphStyle
            ]
        )
        let textView = UITextView( frame: CGRect(
            x: 20,
            y: 25,
            width: 260,
            height: 400
        ) )
        textView.attributedText = myMutableString
        self.view.addSubview( textView )
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

但是当我将可变字符串添加到 UITextView 时,它会不断破坏单词。

当我去paragraphStyle.lineBreakMode = NSLineBreakMode.byCharWrapping时,这个词没有出现在同一个地方......所以它确实有效果。但这仍然是片面的。我有一个在«c»之后中断的单词«call»,这非常奇怪。

这是我可以在故事板编辑器中重现的东西:

【问题讨论】:

  • 对我来说,你的代码工作得很好,在一个使用 viewController.view 作为你的 textView 超级视图的空项目中,所以我认为你的问题是由我可以提供的其他东西引起的,你可以在这里看到imgur.com/a/q5rjI
  • 你说得对,我打错了一些值。我进行了编辑,以便为您提供测试的全部内容。

标签: ios swift3 fonts nsmutablestring


【解决方案1】:

这是预期的行为。根据 Apple 的文档,

通过WordWrapping

换行发生在单词边界,除非单词 本身不适合单行。见字符和字素 用于讨论问题的字符串编程指南中的集群 与确定单词边界有关。

byCharWrapping

换行发生在第一个不适合的字符之前。

更多信息请参考Apple's Documentation

【讨论】:

  • 不,不是。它说Wrapping occurs at word boundaries。单词call 中的call 之间没有单词边界。 call 这个词放在一行中。
  • 在您的初始帖子(没有屏幕截图)中,问题表明单词 call 使用byWordWrapping 正确显示并使用byCharWrapping 截断。因此我的回答。当它说Wrapping occurs at word boundaries时,表示如果整个单词(由空格确定)不能放在一行中,则将其移至下一行
  • 蓝色截图在我最初的帖子中。通话一词被切断。电话这个词不是。如果通话和电话之间的空间不是不间断的(我是如何设法在那里找到的......)那显然是平台中的一个错误。在我看来,我们离错误不远了。 UITextView 不够聪明,无法在需要时切断非中断空间,这一事实令人失望。如果我用呼叫和电话之间的连字符替换空格,则 UITextView 会在连字符处剪切。因此它将连字符视为潜在的空白。但不是真正的空间。整洁。
  • 令人失望,也许(这是主观的)。错误,当然不是。您可能可以为此向 Apple 添加功能请求(不幸的是,他们目前没有单独的功能请求门户,因此您必须通过错误报告器来完成)
【解决方案2】:

Aaaaaannnnddd 解决方案是尝试在 sublime 文本中编辑我的代码,并意识到电话和通话之间存在不可破坏的空间。

这似乎是一个非常愚蠢的基本功能。为什么 Xcode 不能告诉我...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多