我正在使用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?
我尝试过的想法:
下面的代码起作用了,但是我只能通过一个按钮。
[UIButton]
答案 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
}
}
}