如何使用框架在 Swift 循环中设置 x 位置

How to use frame to set x position in loop on Swift

我有一个数组,其计数在 1 到 3 之间变化。 我想将它们框在屏幕中间一定距离 标签的宽度也是固定的

let array = ["some1", "some2", "some3"]

func setLabel(){
  var i = -1
  for text in array{
      i += 1
      let label = UILabel()
      label.fram = CGRect(x: screenWidth/2 - (CGFloat(i)*50) + 25, y: 100, width: 50 , height: 20)
      label.text = text
      addSubview(label)
  }
}

真正简单的方法是将标签(一个、两个或三个)放入居中的 UIStackView 中。您仍然需要知道标签所需的固定宽度并对每个标签应用宽度约束,但其他一切都会自行处理。

作为演示,我使用了 100 的任意宽度,所有三个标签的文本都只是 "UILabel",如您的图片所示。这是带有一个标签的样子:

下面是三个标签的样子:

下面是我使用的代码(sv是stack view,已经在storyboard中配置好了;n是我们想要的标签数量):

    for _ in 1...n {
        let lab = UILabel()
        lab.text = "UILabel"
        lab.textAlignment = .center
        lab.translatesAutoresizingMaskIntoConstraints = false
        lab.widthAnchor.constraint(equalToConstant: 100).isActive = true
        sv.addArrangedSubview(lab)
    }

因此,您真正需要做的就是在我们循环时从您的数组中获取正确的文本,然后您就完成了。关键是你根本不需要考虑框架! UIStackView 为我们强加了正确的框架。


注意 尽管我在上面说过堆栈视图是 "configured in the storyboard",但这与答案无关。您也可以在代码中创建和配置堆栈视图,而无需更改我的答案。重点是堆栈视图 已经知道 如何接收任意数量的视图,space 它们均匀分布,并作为一个整体居中。这就是它的用途。因此,如果正如您的问题所暗示的那样,您无法自己管理为视图分配框架的算法,为什么不让堆栈视图为您完成呢?

您可以按照 的建议使用 stackview。如果你不想使用 stackview,你可以通过数组计数和标签索引来计算 x 位置,像这样

let array = ["some1", "some2", "some3"]
func setLabel(){
    var i:CGFloat = 0
    for text in array{
        i += 1
        let label = UILabel()
        label.backgroundColor = .red
        label.frame = CGRect(x: (view.bounds.width/CGFloat(array.count+1))*i-25, y: 100, width: 50 , height: 20)
        label.text = text
        view.addSubview(label)
    }
}