Swift:以编程方式同等地隔开远处的视图?

时间:2017-05-14 01:41:37

标签: ios swift uiview swift3

好吧,这似乎比数学问题更重要 - 我想在水平距离上产生一定数量的子视图(均匀分布)(没有设置间隙)。 我想在每一侧设置一个保证金,无论数量多少,均可在剩余空间内平均分配视图。这就是我所拥有的:

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)
        }

这同样分配,但它们不会占用所有空间: enter image description here

这里有什么问题?我如何保留每一方的保证金并平均分配意见?

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)
        }

3 个答案:

答案 0 :(得分:2)

以下是我的建议,使其更加简单明了:

  1. 在计算中使用节点的宽度
  2. 计算节点左侧的位置而不是中心
  3. 独立计算每个节点的位置(不要使用lastPos
  4. 如果您有足够的空间放置所有节点,请计算padding,这是节点可用的额外空间
  5. 否则(padding < 0),计算每个节点的哪个部分可以显示而不覆盖。使用最后一个节点永远不会覆盖的事实
  6. 考虑到这一点,实现可能如下所示:

    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)