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
}
}
我正在学习斯坦福 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
}
}