Autolayout动态添加UIViews

时间:2017-09-18 17:07:33

标签: ios swift autolayout

我需要一些关于如何为动态添加UILabels添加约束的建议

假设我有一个名为(A)的UIView,其大小(screenwidth,200)被添加到UIViewcontroller视图中。在视图A上,我使用superview在其前缘和后缘上设置了自动调整大小的掩码。

现在,在运行时,我正在添加带有字符串字符的UILabel。例如,如果字符串是“HELLO”,我将以相等的间隔为HELLO中的每个字符添加五个UILabel。

当方向从纵向变为横向时,UILabel的间距不均匀。我没有对UILabels设置任何限制,需要一些关于如何添加约束的建议。

除了可用的限制之外,还有其他任何解决方案可以使UILabel在横向和纵向模式下均匀展开吗?

由于

2 个答案:

答案 0 :(得分:1)

我可以推荐使用UIStackView。 Sweeper的解决方案不是在屏幕上使用动态添加,所以我想我会提供一个程序化的解决方案。

要动态添加这些,请使用以下示例。

首先:

@IBOutlet weak var containerView: UIView!

这应该是您的描述中的视图A,并确保将其与故事板挂钩。

要添加标签,我们首先将堆栈视图添加到容器视图中:

let stackView = UIStackView()
stackView.distribution = .fillEqually
stackView.alignment = .fill
stackView.spacing = 15
stackView.autoresizingMask = [.flexibleLeftMargin,.flexibleRightMargin]
containerView.addSubview(stackView)
stackView.centerXAnchor.constraint(equalTo: (stackView.superview?.centerXAnchor)!, constant: 0).isActive = true
stackView.centerYAnchor.constraint(equalTo: (stackView.superview?.centerYAnchor)!, constant: 0).isActive = true
stackView.heightAnchor.constraint(equalTo: (stackView.superview?.heightAnchor)!, constant: 0).isActive = true
stackView.widthAnchor.constraint(equalToConstant: 200).isActive = true

你可以使用宽度锚来获得你想要的东西。

然后,当您想要添加标签时,请使用:

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 5, height: 5))
label.text = "E"
stackView.addArrangedSubview(label)

let labelTwo = UILabel(frame: CGRect(x: 0, y: 0, width: 5, height: 5))
labelTwo.text = "L"
stackView.addArrangedSubview(labelTwo)

//... And so on

堆栈视图可以轻松添加子视图而不会有太多限制。但是,您必须向堆栈视图本身添加约束以在屏幕上显示某些内容!

我希望这会有所帮助。

答案 1 :(得分:0)

在iOS 9中,UIStackView被引入。这是使用它们的绝佳机会!

堆栈视图将对前导,尾随和其他必要属性进行约束,以使其保持在您想要的位置。堆栈视图的分布应该是“Fill Equally”。

enter image description here

在VC中添加插座,并在需要时将标签添加到堆栈视图中!