Swift 3 NSMutableParagraphStyle: NSLineBreakMode.byWordWrapping продолжайте разбивать слова

У меня есть стиль NSMutableParagraphStyle, который я применяю к NSMutableAttributedString:

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, она продолжает ломать слова.

Слово break не появляется в том же месте, когда я выбираю paragraphStyle.lineBreakMode = NSLineBreakMode.byCharWrapping... Так что эффект есть. Но это еще частично. У меня есть слово «позвонить», которое прерывается после «с», это очень странно.

втф

И это то, что я могу воспроизвести в редакторе раскадровки:

введите здесь описание изображения введите здесь описание изображения введите здесь описание изображения


person fabien    schedule 16.08.2017    source источник
comment
для меня ваш код работает нормально, как и должен, в пустом проекте, использующем viewController.view в качестве супервизора вашего textView, поэтому я думаю, что ваша проблема вызвана другими вещами, которые я могу предоставить, как вы можете видеть здесь imgur.com/a/q5rjI   -  person Reinier Melian    schedule 16.08.2017
comment
Вы правы, я пропустил некоторые значения. Я отредактировал, чтобы вы могли получить полное содержание теста.   -  person fabien    schedule 16.08.2017


Ответы (2)


Это ожидаемое поведение. Согласно документации Apple,

по переносу слов

Перенос происходит на границах слов, если само слово не помещается на одной строке. См. «Символы и кластеры графем в руководстве по программированию строк» ​​для обсуждения вопросов, связанных с определением границ слов.

byCharWrapping

Перенос происходит перед первым неподходящим символом.

Для получения дополнительной информации см. документацию Apple.

person Malik    schedule 16.08.2017
comment
Нет, это не так. Там написано Wrapping occurs at word boundaries. Между c и all в слове call нет границы слова. А слово call уместилось в одну строку. - person fabien; 16.08.2017
comment
В вашем первоначальном сообщении (без скриншотов) вопрос предполагал, что слово call правильно отображается с помощью byWordWrapping и обрезается с помощью byCharWrapping. Отсюда мой ответ. Когда написано Wrapping occurs at word boundaries, это означает, что если целое слово (определяемое пробелами) не помещается в строку, оно перемещается на следующую строку. - person Malik; 17.08.2017
comment
Синий скриншот был в моем начальном посте. Слово «звонок» вырезано. Слово телефон не подходит. Если бы пространство между звонком и телефоном не было неразрывным (как я ухитрился туда попасть...), это явно была бы ошибка в платформе. И на мой взгляд, мы не далеко от ошибки. Тот факт, что UITextView недостаточно умен, чтобы при необходимости вырезать неразрывное пространство, разочаровывает. Если я заменю пробел дефисом между звонком и телефоном, UITextView обрежет дефис. Таким образом, он рассматривает дефис как потенциальный пробел. Но не реальное пространство. Аккуратный. - person fabien; 17.08.2017
comment
Разочаровывает, может быть (это субъективно). Баг, точно нет. Вероятно, вы можете добавить для этого запрос функции в Apple (к сожалению, в настоящее время у них нет отдельного портала запросов функций, поэтому вам придется сделать это через репортера об ошибках) - person Malik; 18.08.2017

Aaaaaannnnddd решение состояло в том, чтобы попытаться отредактировать мой код в возвышенном тексте и понять, что между телефоном и звонком есть неразрывное пространство.

Это кажется таким глупым базовым функционалом. Почему Xcode не может сказать мне, что...

person fabien    schedule 16.08.2017