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

时间:2015-10-28 04:36:04

标签: ios swift uilabel

我正在参加斯坦福冬季2015 Swift / iOS课程,在完成作业时,我遇到了一个我想改变的行为。

我使用视频中描述的Autolayout(将显示引脚设置为前导和尾随视图边缘)和计算器应用程序“显示”UILabel很好,初始值为0,每当用于设置它的值(一个字符串) )是非零和非“”。

如果它是nil或“”,则整个UILabel消失。我想要做的是在没有值显示或不正确的计算结果为零时“清除”显示。

关于一般如何处理此问题的任何提示? “清除”UILabel而不改变它的屏幕尺寸?

编辑(感谢Rob) UILabel具有以下约束 1.按住Option键并向左拖动到包含UIView,选择“领先”的东西(在通勤上班时无法检查确切的措辞。 2.与(1)相同的方法,除了拖动到右边缘并选择“尾随” 3.选项单击 - 向上拖动到视图顶部,选择“垂直”菜单选项。 4.与(3)相同,只是拖动到GUI上UILabel下面的UIButton。

使用这些设置时,包含数字的标签始终可见,并且(如果理解,将对其进行着色以验证)即使文本没有,也会在屏幕上延伸。

只要UILabel的内容不为空,布局在配置文件和横向上看起来都是正确的。如果是空的,它似乎“缩小到适合”,以至于下面的按钮向上移动。

自90年代中期以来,我就是一名C ++开发人员,但我在iOS / Swift开发方面经验不多,只有几周的经验。

谢谢!

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

在我的情况下,我最终把它变成了一个空格,所以“”而不是“”

答案 2 :(得分:0)

使用UILabel中指定的自定义Interface Builder >> Identity inspector >> Custom Class >> Class类来覆盖UILabel内在内容大小。

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

夫特:

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
    }
}