UILabel lineBreakMode, установленный в .ByTruncatingTail, заставляет текст RTL арабский c отображаться неправильно - PullRequest
1 голос
/ 30 апреля 2020

У меня есть UILabel с текстом RTL Arabi c внутри. Все выглядит правильно, пока я не изменяю lineBreakMode. Мне нужно его обрезать вместо byTruncatingTail, чтобы не показывать символ эллипса, так как я пытаюсь показать градиентную маску на левом краю.

Я пытался изменить contentMode, alignment et c но ничего не помогает. Правая сторона надписи, кажется, начинает текст где-то посередине, а не с начала (т. Е. Самый правый символ в тексте).

Это то, что я вижу с lineBreakMode = .byClipping

enter image description here

И вот что я вижу, когда убираю lineBreakMode

enter image description here

Вот код

let arabicLabel = UILabel(frame: .zero)
arabicLabel.semanticContentAttribute = .forceRightToLeft
arabicLabel.numberOfLines = 1
//arabicLabel.lineBreakMode = .byClipping
arabicLabel.text = "عِنْدَمَا1 عِنْدَمَا2 عِنْدَمَا3 عِنْدَمَا4 عِنْدَمَا5 عِنْدَمَا6 قَدِمْتُ عَلَى (صَاحِبِي) عِنْدَمَا7 عِنْدَمَا8 عِنْدَمَا9 عِنْدَمَا10 عِنْدَمَا عِنْدَمَا قَدِمْتُ عَلَى (صَاحِبِي)"
arabicLabel.translatesAutoresizingMaskIntoConstraints = false
contentView.addSubview(arabicLabel)

1 Ответ

0 голосов
/ 30 апреля 2020

Потратив на это достаточно времени, я прекратил это делать уродливо способом, переопределив drawText и добавив произвольное количество отступов, чтобы эффективно скрыть символ эллипсов и обрабатывая его как для RTL, так и для LTR. , Я мог бы основать это на semanticContentAttributes вместо этого, но в моем случае метка будет выравниваться по правому краю только тогда, когда она содержит текст RTL. Мне также пришлось переопределить text, чтобы автоматически определять доминирующий набор языков и автоматически изменять выравнивание.

  public override func drawText(in rect: CGRect) {
    let extraWidth = fadeLength + 50
    var newRect = rect

    if self.textAlignment == .right {
      newRect.origin.x -= extraWidth
      newRect.size.width += extraWidth
    } else {
      newRect.size.width += extraWidth
    }

    super.drawText(in: newRect)
  }
...