好吧,这似乎比数学问题更重要 - 我想在水平距离上产生一定数量的子视图(均匀分布)(没有设置间隙)。 我想在每一侧设置一个保证金,无论数量多少,均可在剩余空间内平均分配视图。这就是我所拥有的:
func spawnNodes(num: Int, margin: CGFloat)
{
let width = self.bounds.width - 2*margin
let length = Int(width)/num //20
var lastPos = margin
for i in 1...num {
let n = Node(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
n.center = CGPoint(x: margin+(CGFloat(i*length)/2), y: self.bounds.height*0.2)
lastPos = n.center.x
self.addSubview(n)
}
这里有什么问题?我如何保留每一方的保证金并平均分配意见?
TAKE 2:
for i in 1...num {
let n = Node(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
let space = (width - CGFloat(num)*n.bounds.width)/CGFloat(num-1)
n.center = CGPoint(x: lastPos+space+n.bounds.width+(CGFloat(i*length)/2), y: self.bounds.height*0.2)
lastPos = n.center.x
self.addSubview(n)
}
答案 0 :(得分:2)
以下是我的建议,使其更加简单明了:
lastPos
)padding
,这是节点可用的额外空间padding < 0
),计算每个节点的哪个部分可以显示而不覆盖。使用最后一个节点永远不会覆盖的事实考虑到这一点,实现可能如下所示:
func spawnNodes(num: Int, margin: CGFloat) {
let width = self.bounds.width - 2 * margin
let nodeWidth : CGFloat = 50
var availableWidth = width / CGFloat(num)
var padding = (availableWidth - nodeWidth) / 2
if padding < 0 {
padding = 0
availableWidth = (width - nodeWidth) / CGFloat(num - 1)
}
padding += margin
let y = self.bounds.height * 0.2
for i in 0 ..< num {
let x = CGFloat(i) * availableWidth + padding
let n = Node(frame: CGRect(x: x, y: y, width: nodeWidth, height: 50))
self.addSubview(n)
}
}
答案 1 :(得分:1)
使用UIStackView。这使得这很简单。
答案 2 :(得分:1)
这只是一个数学问题。你的第一次尝试几乎就在那里但是x坐标有轻微的错误计算。
它必须是:保证金+(i-1)*长度
n.center = CGPoint(x: margin+CGFloat((i-1)*length)), y: self.bounds.height*0.2)