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

Posted

技术标签:

【中文标题】设置为 nil 或 "" 时的 UILabel 文本属性使 UILabel 从视图中消失(Swift / Autolayout / iOS9.1)【英文标题】:UILabel text property when set to nil or "" makes UILabel disappear from view (Swift / Autolayout/ iOS9.1) 【发布时间】:2015-10-28 04:36:03 【问题描述】:

我正在参加 2015 年斯坦福冬季 Swift/ios 课程,在做作业时,我遇到了一种我想改变的行为。

我使用视频中描述的自动布局(将显示引脚设置为前视图和后视图边缘),并且计算器应用程序“显示”UILabel 的初始值为 0 以及用于设置它的值(字符串) 是非零和非“”。

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

关于一般情况下应由谁来处理此问题的任何提示? “清除” UILabel 而不改变它的屏幕尺寸?


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

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

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

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

谢谢!

【问题讨论】:

编辑您的问题以描述您在标签视图上设置的约束以控制其位置和大小。 你试过打电话给label.sizeToFit()吗? 如果倒计时计时器 == 0,您是否尝试过创建返回:“”(清除标签)的 if 语句? @Varsuuk 不确定“倒计时计时器 == 0”是什么?参考;)但我确实选择了非常“对我的开发人员敏感度没有吸引力”的解决方法,即每当支持 Double 时将 UILabel 设置为“”(1 个空格)?属性返回 nil。 UILabel 在 UIStackView 中吗? 【参考方案1】:

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

【讨论】:

谢谢,我会在 Mac 上检查这个,但是有没有办法让 iOS 控制的最小宽度成为视图宽度?我相信这是我在从控制中拖到左边和右边缘时所做的事情,但我是新的。也许它是全宽,但也许它是高度,正如你提到的,它可能已经缩小了 - 我会根据视图为 UILabel 着色以获取更多信息。 我认为你需要做的就是给它一个最小高度。 谢谢@animal,我当时在想,但是用我暴躁的拇指在 iPad 上打字让我在之前的评论中过早地输入了一行。将检查和更新。 我更新了代码以设置 UILable 不透明,事实上,它确实从开始时将整行填充为黑色并且在 UILabel 中具有有效值时变为 nil 或“ ”。\n 试图查看如何设置“最小高度/宽度”与我通过选项拖动设置自动布局约束所做的事情。今晚我可能需要尝试一下,因为工作太忙了,除了最近的更新之外,无法查看这些内容。谢谢! 也许这会有所帮助:developer.apple.com/library/ios/recipes/…【参考方案2】:

使用在Interface Builder >> Identity inspector >> Custom Class >> Class 中分配的自定义UILabel 类来覆盖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
    

【讨论】:

以上是关于设置为 nil 或 "" 时的 UILabel 文本属性使 UILabel 从视图中消失(Swift / Autolayout / iOS9.1)的主要内容,如果未能解决你的问题,请参考以下文章

在特定位置时的实例变量 nil

使用 JQuery 时的 ":last-of-type" 或 ".last()"

关于NSLocalizedString(@"Foo %@",nil)

addTarget:action:forControlEvents: target 为 nil 时的选择器语法?

Swift:尝试测试 ObservedObject 变量是不是为 nil 时的 EXC_BREAKPOINT

使用查找命令参数时的消息 -cmin 或 -mmin " FSUM6372 Unknown option "-cmin" "