[英]How to insert UIButtons of Dynamic size into a UIStackView dynamically?
[英]How to add an array of UIButtons onto a UIStackview?
我使用26个字母,并使用相应的字母创建一个UIButton
,在创建UIButtons
数组后,我将存储这些按钮的Array发送给了Array视图。
stackview也在一个名为abcBtnView
的UIView
。
如果我将整个UIButton
数组传递给它,它将起作用,但是垂直或水平放置26个按钮看起来并不好。 因此,我决定不发送26个按钮的数组,而是发送6个数组,5个带有5个UIbuttons
数组和一个带有1个按钮的数组。
我得到的错误是我无法将UIButton
转换为UIView
类型 。
参数UIStackview(arrangedSubviews: [UIView])
的类型为[UIView]
但是它仍然是我第一次使用[UIButton]
数组,但是如果我放置了多个UIbuttons
,则UIbuttons
。
我想知道如何将多个UIButton数组添加到UIStackview,以便可以有6列和5行的UIButton?
我尝试过的想法:
下面的代码起作用了,但我只能通过一个按钮。
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.