UILabel 文本 属性 当设置为 nil 或 "" 时会使 UILabel 从视图中消失 (Swift / Autolayout/ iOS9.1)

UILabel text property when set to nil or "" makes UILabel disappear from view (Swift / Autolayout/ iOS9.1)

我正在学习斯坦福 2015 年冬季 Swift/iOS 课程,在做作业时我 运行 变成了我想改变的行为。

我按照视频中的描述使用自动布局(使显示引脚指向前视图边缘和后视图边缘)和计算器应用程序 "Display" UI标签很好,初始值为 0 并且每当用于设置它的值(一个字符串)是非零和非“”。

如果为 nil 或 "",则整个 UILabel 将消失。我想做的是 "clear" 每当没有值可显示或计算不正确导致 nil 时显示。

一般情况下谁来处理这个问题有什么建议吗? "Clearing" UI不改变屏幕尺寸的标签?


编辑(感谢 Rob) UI标签有以下约束 1. 按住 Option 键并向左拖动以包含 UIView,selected "leading" something(上班途中无法检查确切的措辞。 2. 方法同(1),只是拖动到右边缘, selecting "trailing" 3. 选项单击并拖动到视图顶部,select "vertical" 菜单选项。 4. 与 (3) 相同,只是拖动到 GUI 上 UI 标签下方的 UI 按钮。

使用这些设置,包含数字的标签始终可见,并且(如果理解,将为它着色以验证)在屏幕上延伸,即使文本不可见。

只要 UILabel 的内容不为空,布局在侧面和横向上看起来都是正确的。如果为空,它似乎 "shrink to fit" 以至于下面的按钮向上移动到顶部。

我从 90 年代中期开始就是一名 C++ 开发人员,但我 UI 经验很少,在 iOS/Swift 开发方面的经验不超过几周。

谢谢!

您始终可以为 UILabel 指定最小宽度和最小高度或约束标签的左侧和右侧。这应该可以防止标签将其尺寸更改为零。

使用在 Interface Builder >> Identity inspector >> Custom Class >> Class 中分配的自定义 UILabel class 覆盖 UILabel 固有内容大小。

无需创建任何多余的自动布局约束。

Swift:

class UILabelNonCompressible: UILabel
{
    private static let NonCompressibleInvisibleContent = " "

    override var intrinsicContentSize: CGSize
    {
        if /* zero-width */ text == nil ? true : text!.isEmpty
        {
            // prefer mirror-and-calculate over modify-calculate-restore due to KVO
            let doppelganger = createCopy()

            // calculate for any non-zero -height content
            doppelganger.text = UILabelNonCompressible.NonCompressibleInvisibleContent

            // override
            return doppelganger.intrinsicContentSize
        }
        else
        {
            return super.intrinsicContentSize
        }
    }
}

您还需要 "How do copy for UILabel?":

extension UILabel
{
    func createCopy() -> UILabel
    {
        let archivedData = NSKeyedArchiver.archivedData(withRootObject: self)
        return NSKeyedUnarchiver.unarchiveObject(with: archivedData) as! UILabel
    }
}