如何使用框架在 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)
}
}
我有一个数组,其计数在 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 它们均匀分布,并作为一个整体居中。这就是它的用途。因此,如果正如您的问题所暗示的那样,您无法自己管理为视图分配框架的算法,为什么不让堆栈视图为您完成呢?
您可以按照
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)
}
}