如何将UIButtons数组添加到UIStackview?

时间:2019-05-03 13:46:40

标签: ios swift xcode uibutton uistackview

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

堆栈视图也在UIView的{​​{1}}内部。

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

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

参数UIView的类型为UIStackview(arrangedSubviews: [UIView]),但是它还是第一次使用了我的[UIView]数组,但是如果我放置了多个{{ 1}}。

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

我尝试过的想法:

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

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

[UIButton]

2 个答案:

答案 0 :(得分:0)

听起来您正在尝试创建UIButton的网格。单个UIStackView不能做到这一点。与此相反,您要么需要在另一个UIStackView中包含一堆UIStackView,要么让您知道这是一个非常糟糕的主意。

或者代替重新发明轮子,您可以使用UICollectionView,然后将按钮布置为网格。每个按钮都将位于UICollectionViewCell内。

答案 1 :(得分:0)

您的代码使用框架情节提要板工作,因此问题可能存在于代码的其他位置。这是根据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
    }
  }
}

Result