【问题标题】:Space characters being removed from end of String - UILabel Swift从字符串末尾删除空格字符 - UILabel Swift
【发布时间】:2015-10-10 15:39:52
【问题描述】:

我在 Swift 中有以下表格视图单元的代码

let rcap = cell.viewWithTag(613) as! UILabel
rcap.text = "Capacity: \(room.capacity)  "  // I added space at the end

字符串末尾的空格字符,在屏幕上显示时会被删除。

如果我在字符串的开头添加空格字符没有问题。

目前我正在使用这个“句号”技巧,但这还不够好:

rcap.text = "Capacity: \(room.capacity)   ."  

有什么想法吗?

我也试过了:

rcap.text = "Capacity: \(room.capacity)  " + " "

【问题讨论】:

  • 很好。我想更好地控制空间的数量,但目前这是一个不错的方法!
  • 好的...我认为\t 有效,但空间很小
  • 知道为什么尾随空格很重要会很有趣。也许您的问题有不同的解决方案。
  • 我有一个右对齐的标签。但我不希望文本从屏幕的最右侧开始。我可以为标签添加一些约束,这会起作用,但我很惊讶最后没有空间选项
  • @Ryan,Martin 的“绝妙技巧”在 2020 年的今天确实奏效了。在使用等宽字体时,这绝对是必不可少的。

标签: ios string swift whitespace


【解决方案1】:

2020 年

在使用等宽字体和进行布局时,这个问题很关键,例如,在等宽字体末尾可能有对齐空间的用户代码。

\u{200c} 似乎工作得很好:

请注意,@MartinR 的解决方案实际上运行良好,今天,公元 2020 年,iOS 13,Xcode 11。

.text = "FATTIE KODE " + reservation + reservation.neededTrailingSpaces + \u{200c}"

.text = "FATTIE KODE " + reservation + reservation.neededTrailingSpaces + \u{200c}"

.text = "FATTIE KODE " + reservation + reservation.neededTrailingSpaces + \u{200c}"

您现在完全可以正常设置字体大小等,一切正常。


奖励代码示例!

这是一个简单的 UILabel 填充它,所以你不需要做任何其他事情:

class PaddyLabel: UILabel {

// pad always to 20 characters...

override var text: String? {
        get {
            return super.text
        }
        set {
            if newValue == nil {
                super.text = nil
                return
            }
            var t = newValue!
            while t.count < 20 { t += " " }
            t += "\u{200c}"
            super.text = t
        }
    }

所以在上面三个黄色的例子中,你只需这样做

.text = "FATTIE KODE " + reservation

不必费心手动添加所需的空格。


请注意,即使您不使用等宽字体,一个典型的实际用例是当您想要“堆在一起”UILabels - 假设它们是,比如说,每个单词 - 并且无论字体大小等如何,它们之间都有绝对正确的空间,也就是说它只是一个 UILabel 中的一个句子。

唯一的方法是让 UILabel “实际包含空格”。


如果它在以后的 iOS 中不起作用...

也许这会(再次?)在未来的 iOS 中中断。

我知道的唯一其他解决方案就是这个。首先,向 UILabel 添加填充是非常困难的。这里解释一下:

向 UILabel 手动添加填充?

How to actually reliably add damned padding to a UILabel

事实上,使用类似的技术,可以使用intrinsicContentSizedrawTexttextRect 在一端强制增加额外宽度。要知道要添加多少宽度,您必须使用虚拟示例文本以及相关字符数来计算。进行该计算将需要通常的烦人技术来计算可能的文本渲染大小。但是因为这很糟糕,幸运的是我们可以使用@MartinR 的惊人技巧(像往常一样!)

【讨论】:

    【解决方案2】:

    尝试使用零宽度空格代替句点。它可以在数字键盘上使用左 Alt0173 编写。或者你可以在这里复制并删除引号:"­"

    因此,您设置文本的代码将如下所示(末尾有零宽度空格):
    rcap.text = "Capacity: \(room.capacity) ­"
    不间断空格 (\u{00a0}) 也应该可以工作,它的用法与 Martin 和 Fattie 的回答中的 \u{200c} 一样

    【讨论】:

      【解决方案3】:

      我已经为UILabel 创建了自定义类,看看:

      import UIKit
      
      @IBDesignable class CustomLable: UILabel {
          @IBInspectable var topInset: CGFloat = 5.0
          @IBInspectable var bottomInset: CGFloat = 5.0
          @IBInspectable var leftInset: CGFloat = 7.0
          @IBInspectable var rightInset: CGFloat = 7.0
      
          override func drawText(in rect: CGRect) {
              let insets = UIEdgeInsets.init(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset)
              super.drawText(in: rect.inset(by: insets))
          }
      
          override var intrinsicContentSize: CGSize {
              let size = super.intrinsicContentSize
              return CGSize(width: size.width + leftInset + rightInset,
                            height: size.height + topInset + bottomInset)
      
          }
      
      }
      

      您可以从StoryboardUILabel 分配一个类并提供您需要的空间。

      【讨论】:

      • 请注意,这个问题是关于字符 " " 空格 - 而不是关于“添加空格”(填充)。
      • 对于在此处使用谷歌搜索的任何人,如果您要添加填充,这并不完全正确。在 UILabel 中添加填充实际上非常棘手!对此问题的全面检查:stackoverflow.com/a/58876988/294884
      【解决方案4】:

      向标签添加约束对我来说似乎是更好的解决方案。 它允许您在标签和标签之间定义明确的距离 表格视图单元格的边距。 空格的宽度取决于字体,如果缩小标签中的文本,甚至可能会发生变化,从而导致文本不对齐 表格视图。

      话虽如此,您可以防止尾随空格 通过附加“零宽度非连接符”字符 (U+200C) 删除:

      rcap.text = "Capacity: \(room.capacity)  \u{200c}"
      

      但我认为这更像是一种“技巧”,而不是解决问题的正确方法 问题。

      更新: 看来这个“技巧”在 iOS 10 中不再起作用了, 所以应该使用布局约束,正如最初建议的那样。

      【讨论】:

      • @onemoreanimal:它是如何“不起作用”的?它不编译吗?它会产生意想不到的结果吗?
      • 它编译并运行,但编译器仍会从 UILabel 中删除特殊字符之前的尾随空格
      • @onemoreanimal:它不再适用于 iOS 10(独立于 Swift 版本)。我已经相应地更新了答案。感谢您的反馈!
      • Unicode 字符 'INVISIBLE SEPARATOR' (U+2063) 应该也能正常工作,宽度也为 0。
      • @user3441734 ,这是一个巨大的提示,你应该把它作为答案。
      【解决方案5】:
      rcap.text = String.localizedStringWithFormat("Capacity: %@ ", rrom.capacity)
      

      试试上面的代码可能会起作用

      【讨论】:

      • room.capacity 是哪种类型的变量
      猜你喜欢
      • 2023-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多