【问题标题】:Swift: Programmatically equally space out views over a distance?斯威夫特:以编程方式将视图隔开一段距离?
【发布时间】:2017-05-14 01:41:37
【问题描述】:

好的,这似乎是一个比任何事情都重要的数学问题——我想生成给定数量的子视图,在一定距离上水平分布(没有设置间隙)。 我想在每一边设置一个边距,无论数量如何,都将视图平均分布在剩余空间中。这就是我所拥有的:

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

这是均匀分布的,但它们不会占用所有空间:

这里有什么问题?如何在每一边保持一个边距并平均分配视图?

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

【问题讨论】:

  • 不计算length - 计算间距。 n 对象之间有 n-1 空格。 spacing = (width - n*objectWidth)/(n-1)。现在将lastPos 增加spacing+objectWidth
  • 你能把它写下来作为例子吗?
  • 好的。在上面的编辑中,我尝试遵循您的建议,但没有奏效。如果您写出答案,我将不胜感激
  • 试试n.center = CGPoint(x: lastPos+space+n.bounds.width), y: self.bounds.height*0.2)
  • 您是否有理由不尝试仅以编程方式添加布局约束?

标签: ios swift uiview swift3


【解决方案1】:

以下是我的建议,以使其更易于实施:

  1. 在计算中使用节点的宽度
  2. 计算节点左侧而不是中心的位置
  3. 独立计算每个节点的位置(不要使用lastPos
  4. 如果您有足够的空间来放置所有节点,请计算padding,这是一个节点可用的额外空间
  5. 否则(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)
    }
}

【讨论】:

    【解决方案2】:

    使用 UIStackView。它使这变得非常简单。

    【讨论】:

      【解决方案3】:

      这只是一道数学题。您的第一次尝试几乎就在那里,但对 x 坐标有轻微的计算错误。

      必须是:边距 + (i-1)*length

      n.center = CGPoint(x: margin+CGFloat((i-1)*length)), y: self.bounds.height*0.2)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-24
        • 1970-01-01
        • 2017-07-22
        • 2017-03-24
        • 1970-01-01
        • 2018-02-10
        相关资源
        最近更新 更多