【问题标题】:UILabel doesn't always show up in its superviewUILabel 并不总是出现在它的超级视图中
【发布时间】:2017-10-29 01:01:06
【问题描述】:

我正在尝试使用嵌套的视图堆栈视图创建堆栈视图以创建网格。网格中的每个单元格都应该有一个标签。我遇到的问题是标签仅在第一个视图中显示,如this screenshot

我的主堆栈视图的代码很简单:

for _ in 1...5 {
    let view = WeekView()    
    addArrangedSubview(view)
}

这是嵌套堆栈视图的代码。

// Function called in init(frame:)
func configureView() {

    spacing = 8

    for _ in 1...7 {
        let view = UIView()
        let label = UILabel()
        view.addSubview(label)
        addArrangedSubview(view)

        label.text = "hi"
        label.textAlignment = .center

        view.widthAnchor.constraint(equalToConstant: 40).isActive = true
        view.translatesAutoresizingMaskIntoConstraints = false

        label.heightAnchor.constraint(equalTo: view.heightAnchor).isActive = true
        label.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
        label.translatesAutoresizingMaskIntoConstraints = false
    }
}

任何建议都会非常受欢迎。

【问题讨论】:

  • 您没有设置标签的位置,只设置了它的宽度和高度。
  • 感谢您的建议,但我认为如果您移动一个视图,它的所有子视图也会随之移动,不是吗?但我试图打电话给label.frame.origin = view.frame.origin,但没有帮助。
  • 您无法使用frame 设置位置,因为未使用您的自动调整大小掩码。您必须为每个标签添加 X 和 Y 位置的约束。否则位置将是随机的。
  • 感谢您的澄清,现在它就像一个魅力。

标签: ios swift uiview uikit uilabel


【解决方案1】:

您没有设置标签的位置。您可以添加水平和垂直约束,但您也可以简单地这样做:

label.translatesAutoresizingMaskIntoConstraints = true
label.frame = view.bounds
label.autoresizingMask = [.flexibleWidth, .flexibleHeight]

而不是

label.heightAnchor.constraint(equalTo: view.heightAnchor).isActive = true
label.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
label.translatesAutoresizingMaskIntoConstraints = false 

【讨论】:

    【解决方案2】:

    问题可能是你没有设置

    label.translatesAutoresizingMaskIntoConstraints = false
    

    请尝试在创建 UI 元素后直接设置:

    let view = UIView()
    view.translatesAutoresizingMaskIntoConstraints = false
    let label = UILabel()
    label.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(label)
    ...
    view.widthAnchor.constraint(equalToConstant: 40).isActive = true
    view.heightAnchor.constraint(equalToConstant: 40).isActive = true
    

    但是,在您的情况下,我强烈建议您使用UICollectionView。如果你使用它,你会免费获得很多东西(包括平滑的水平滚动)。 该图像看起来像您正在构建某种日历应用程序。如果您使用 UICollectionView,您还将获得一个非常灵活的 API,用于间距和整体布局。

    【讨论】:

    • 感谢您的建议,我添加了view.translatesAutoresizingMaskIntoConstraints。不幸的是,它没有帮助。实际上我一直在寻找UICollectionView,我想我会用它重写这段代码,但在这样做之前我真的很想知道为什么这个标签会这样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    • 2013-07-11
    • 2019-09-12
    • 2014-09-18
    • 1970-01-01
    • 2018-02-28
    相关资源
    最近更新 更多