繁体   English   中英

如何在UIStackview上添加UIButtons数组?

[英]How to add an array of UIButtons onto a UIStackview?

我使用26个字母,并使用相应的字母创建一个UIButton ,在创建UIButtons数组后,我将存储这些按钮的Array发送给了Array视图。

stackview也在一个名为abcBtnViewUIView

如果我将整个UIButton数组传递给它,它将起作用,但是垂直或水平放置26个按钮看起来并不好。 因此,我决定不发送26个按钮的数组,而是发送6个数组,5个带有5个UIbuttons数组和一个带有1个按钮的数组。

我得到的错误是我无法将UIButton转换为UIView类型

参数UIStackview(arrangedSubviews: [UIView])的类型为[UIView]但是它仍然是我第一次使用[UIButton]数组,但是如果我放置了多个UIbuttons ,则UIbuttons

我想知道如何将多个UIButton数组添加到UIStackview,以便可以有6列和5行的UIButton?

我尝试过的想法:

  1. 尝试将[UIButton]转换为[UIView]
  2. 创建一个数组,该数组包含一个UIButtons数组,然后使用for循环将每个UIstackview添加到我们的view(abcBtnView)中。

下面的代码起作用了,但我只能通过一个按钮。

private func makeABCbtns(){

    let abcde = createButtons(named: "A", "B", "C", "D", "E")
    let fghij = createButtons(named: "F", "G", "H", "I", "J")
    let klmno = createButtons(named: "K","L", "M", "N", "O")
    let pqrst = createButtons(named: "P", "Q","R", "S", "T")
    let uvwxy = createButtons(named: "U", "V", "W","X", "Y")
    let z     = createButtons(named: "Z")

    let stackView = UIStackView(arrangedSubviews: abcde)
    stackView.translatesAutoresizingMaskIntoConstraints = false
    stackView.axis = .horizontal
    stackView.spacing = 1
    stackView.distribution = .fillEqually

    // UIView where all the buttons will be in.
    abcBtnView.addSubview(stackView)


    //I am giving the stackview the size of the abcBtnView.
    stackView.anchor(top: abcBtnView.topAnchor,
                     leading: abcBtnView.leadingAnchor,
                     bottom: abcBtnView.bottomAnchor,
                     trailing: abcBtnView.trailingAnchor,
                     centerXaxis: nil,
                     centerYaxis: nil)
}

func createButtons(named: String...) -> [UIButton]{
    return named.map { letter in
        let button = UIButton()
        button.translatesAutoresizingMaskIntoConstraints = false
        button.setTitle(letter, for: .normal)
        button.backgroundColor = .green
        button.setTitleColor( .blue , for: .normal)
        return button
    }

}

听起来您正在尝试创建UIButton的网格。 单个UIStackView不能做到这UIStackView 取而代之的是,你要么需要有一堆UIStackView另一个在s UIStackView ,这只是为了让你知道是一个非常糟糕的主意。

或者,也可以使用UICollectionView而不是重新发明轮子,并将按钮布置为网格。 每个按钮都将位于UICollectionViewCell

您的代码使用框架式情节提要板工作,因此问题可能存在于代码的其他位置。 这是根据Teja的建议重构的代码。

  private func makeABCbtns(){

    let list = [["A", "B", "C", "D", "E"], ["F", "G", "H", "I", "J"], ["K","L", "M", "N", "O"], ["P", "Q","R", "S", "T"], ["U", "V", "W","X", "Y"], ["Z"]]
    var groups = [UIStackView]()

    for i in list {
      let group = createButtons(named: i)
      let subStackView = UIStackView(arrangedSubviews: group)
      subStackView.axis = .horizontal
      subStackView.distribution = .fillEqually
      subStackView.spacing = 1
      groups.append(subStackView)
    }

    let stackView = UIStackView(arrangedSubviews: groups)
    stackView.axis = .vertical
    stackView.distribution = .fillEqually
    stackView.spacing = 1
    stackView.translatesAutoresizingMaskIntoConstraints = false

    abcBtnView.addSubview(stackView)

    stackView.leadingAnchor.constraint (equalTo: abcBtnView.leadingAnchor,  constant: 0).isActive = true
    stackView.topAnchor.constraint     (equalTo: abcBtnView.topAnchor,      constant: 0).isActive = true
    stackView.trailingAnchor.constraint(equalTo: abcBtnView.trailingAnchor, constant: 0).isActive = true
    stackView.bottomAnchor.constraint  (equalTo: abcBtnView.bottomAnchor,   constant: 0).isActive = true
  }

  func createButtons(named: [String]) -> [UIButton]{
    return named.map { letter in
      let button = UIButton()
      button.translatesAutoresizingMaskIntoConstraints = false
      button.setTitle(letter, for: .normal)
      button.backgroundColor = .green
      button.setTitleColor( .blue , for: .normal)
      return button
    }
  }
}

结果

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM