字符串末尾的空格字符被删除 - UILabel Swift

25

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

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

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

如果我在字符串开头添加空格字符,则不会出现问题。

目前我正在使用这个“句号”hack,但它并不够好:

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

有什么想法吗?

我也尝试了:

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

很好。我希望能更加控制空格的数量,但暂时来说这是一个不错的方法! - Greg Peckory
好的...我认为\t可以工作,但只有少量的空间。 - Bhavin Bhadani
2
了解为什么尾随空格很重要会很有趣。也许有不同的解决方案适合您的问题。 - Martin R
我有一个右对齐的标签。但是我不想让文本从屏幕的最右边开始。我可以为标签添加一些约束,这样就可以解决问题,但我很惊讶居然没有末尾空间的选项。 - Greg Peckory
1
@Ryan,Martin的“绝妙技巧”今天确实可行,2020年。这在使用等宽字体时绝对是必不可少的。 - Fattie
显示剩余3条评论
6个回答

44

在我看来,将约束条件添加到标签似乎是更好的解决方案。 它可以让您定义标签和表视图单元格边缘之间的明确定义距离。 空格的宽度取决于字体,如果标签中的文本缩小,甚至可能会发生文本不对齐的情况。

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

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

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

更新:看起来这个“技巧”在iOS 10中已经不再起作用了,因此应该使用布局约束,就像最初建议的那样。


@onemoreanimal:它为什么“不工作”?它无法编译吗?还是产生了意外的结果? - Martin R
它可以编译和运行,但编译器仍会在特殊字符之前从UILabel中删除尾随空格。 - onemoreanimal
空格 + 零宽度非连接符 + 空格 " \u{200c} " 在iOS 10.3上可以使用。它看起来像一个空格。 - najeira
1
Unicode字符“INVISIBLE SEPARATOR”(U+2063)也应该起作用,它的宽度为0。 - user3441734
1
@user3441734,这是一个非常有用的提示,你应该将它作为答案提交。 - Fattie
显示剩余2条评论

4

2020年之前

当使用等宽字体并进行布局时,例如用户代码,在等宽字体中可能在末尾有对齐的空格时,此问题非常关键。

\u{200c} 确实完美地工作:

请注意,@MartinR的解决方案确实完美地工作,截至今天,即2020年,iOS 13,Xcode 11。

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

enter image description here

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

enter image description here

.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

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

唯一实现这一点的方法是让UILabel“实际包括空格”。


如果在未来iOS版本中无法正常工作...

也许将来的iOS版本中(再次)会出现问题。

我所知道的唯一其他解决方案是这样的。首先,仅仅给UILabel添加填充是非常困难的。这里有解释:

手动向UILabel添加填充?

如何可靠地为UILabel添加填充

实际上,使用类似的技术,可以使用intrinsicContentSize、drawText和textRect在一端强制增加额外的宽度。要知道要添加多少宽度,您需要使用示例文本进行计算,并考虑问题中的字符数。进行该计算需要使用通常令人烦恼的技术来计算可能的文本呈现大小。但是因为这很烦人,所以幸运的是我们可以使用@MartinR(像往常一样!)的神奇提示。


0

尝试使用零宽度空格代替句号。可以使用左侧Alt和数字键盘上的0173来编写它。或者您可以在此处复制并删除引号:"­"

因此,设置文本的代码将如下所示(以零宽度空格结尾):
rcap.text = "容量:\(room.capacity) ­"
不间断空格(\u{00a0})也应该可以使用,并且其用法与Martin和Fattie的答案中的\u{200c}相同。


0

我发现一个惊人的技巧。末尾的空格被删除,除非它们在插入字符串中。

例如,不要写成

let aLine = "Hello" + "  "

我写的有点复杂

let aLine = "Hello" + "\("  ")"

然后空格会保留在末尾。但是您可能需要调整空格的数量以使其符合预期。

如果这有所帮助...


0

我已经为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)

    }

}

你可以在Storyboard中为UILabel分配一个类,并提供所需的空间。

请注意,此问题涉及到字符“ ”空格 - 而非关于“添加空间”(填充)的内容。 - Fattie
同样对于任何在这里搜索的人,如果您正在添加填充,那么这并不完全正确。实际上,在UILabel中添加填充非常棘手!有关此问题的全面检查:https://dev59.com/514c5IYBdhLWcg3w3dV_#58876988 - Fattie

-3
rcap.text = String.localizedStringWithFormat("Capacity: %@ ", rrom.capacity)

尝试以上代码,它可能有效。

房间.capacity 是哪种类型的变量? - Ramkumar chintala

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接