swift uipickerview 高度更改不起作用
swift uipickerview height change not working
我知道这个问题已被问过多次,但我已经关注了堆栈溢出中的大部分 link,但似乎没有答案。我还看到某个地方只允许 3 个高度也高于 160,这在我的情况下是不想要的。所以请提出解决方法
这是我试过的代码
//this label doesn't matter
let classLabel: UILabel = {
let label = UILabel()
label.text = "Select Class"
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
//first try
var classPicker = UIPickerView(frame: CGRect(x: 0.0, y: 0.0, width:
30.0, height: 30.0))
//second try
var classPicker: UIPickerView = {
let picker = UIPickerView(frame: CGRect(x: 0.0, y: 0.0, width: 10.0, height: 10.0))
picker.translatesAutoresizingMaskIntoConstraints = false
return picker
}()
//third
lazy var chooseClass: UIStackView = {
classPicker.clipsToBounds = true
classPicker.heightAnchor.constraint(equalToConstant: 30.0)
let stackView: UIStackView = UIStackView(arrangedSubviews: [self.classLabel, self.classPicker])
stackView.axis = .horizontal
stackView.distribution = .fillEqually
stackView.alignment = .fill
stackView.spacing = 10.0
stackView.translatesAutoresizingMaskIntoConstraints = false
return stackView
}()
//and then
chooseClass.heightAnchor.constraint(equalToConstant: 30.0)
我也试过这个 link 的答案,但没有用 How to change UIPickerView height
您需要将 stackView
对齐更改为 .center
。然后你可以根据需要添加witdth和height anchors,只要满足stackView
条件即可。
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
lazy var classLabel: UILabel = {
let label = UILabel(frame: .zero)
label.text = "Select Class"
return label
}()
lazy var classPicker: UIPickerView = {
let pickerView = UIPickerView(frame: .zero)
pickerView.delegate = self
pickerView.dataSource = self
return pickerView
}()
lazy var chooseClass: UIStackView = {
let stackView: UIStackView = UIStackView(frame: .zero)
stackView.axis = .horizontal
stackView.distribution = .fillEqually
stackView.alignment = .center
stackView.spacing = 10.0
return stackView
}()
var dataSource = [1,2,3,4]
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
view.addSubview(chooseClass)
chooseClass.translatesAutoresizingMaskIntoConstraints = false
chooseClass.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
chooseClass.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
chooseClass.heightAnchor.constraint(equalToConstant: 50).isActive = true
chooseClass.widthAnchor.constraint(equalToConstant: UIScreen.main.bounds.width).isActive = true
classPicker.heightAnchor.constraint(equalToConstant: 30).isActive = true
chooseClass.addArrangedSubview(classLabel)
chooseClass.addArrangedSubview(classPicker)
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return dataSource.count
}
func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
let label = UILabel()
label.text = String(dataSource[row])
label.font = UIFont.systemFont(ofSize: 12, weight: .medium)
return label
}
}
我使用了 viewForRow
委托,因为在高度为 30 时,使用 titleForRow
的标题在顶部和底部被裁剪。您应该注意对齐问题等。这会满足您的要求 - 将 pickerView
的高度更改为 30,同时保持 stackView
高度。
我知道这个问题已被问过多次,但我已经关注了堆栈溢出中的大部分 link,但似乎没有答案。我还看到某个地方只允许 3 个高度也高于 160,这在我的情况下是不想要的。所以请提出解决方法
这是我试过的代码
//this label doesn't matter
let classLabel: UILabel = {
let label = UILabel()
label.text = "Select Class"
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
//first try
var classPicker = UIPickerView(frame: CGRect(x: 0.0, y: 0.0, width:
30.0, height: 30.0))
//second try
var classPicker: UIPickerView = {
let picker = UIPickerView(frame: CGRect(x: 0.0, y: 0.0, width: 10.0, height: 10.0))
picker.translatesAutoresizingMaskIntoConstraints = false
return picker
}()
//third
lazy var chooseClass: UIStackView = {
classPicker.clipsToBounds = true
classPicker.heightAnchor.constraint(equalToConstant: 30.0)
let stackView: UIStackView = UIStackView(arrangedSubviews: [self.classLabel, self.classPicker])
stackView.axis = .horizontal
stackView.distribution = .fillEqually
stackView.alignment = .fill
stackView.spacing = 10.0
stackView.translatesAutoresizingMaskIntoConstraints = false
return stackView
}()
//and then
chooseClass.heightAnchor.constraint(equalToConstant: 30.0)
我也试过这个 link 的答案,但没有用 How to change UIPickerView height
您需要将 stackView
对齐更改为 .center
。然后你可以根据需要添加witdth和height anchors,只要满足stackView
条件即可。
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
lazy var classLabel: UILabel = {
let label = UILabel(frame: .zero)
label.text = "Select Class"
return label
}()
lazy var classPicker: UIPickerView = {
let pickerView = UIPickerView(frame: .zero)
pickerView.delegate = self
pickerView.dataSource = self
return pickerView
}()
lazy var chooseClass: UIStackView = {
let stackView: UIStackView = UIStackView(frame: .zero)
stackView.axis = .horizontal
stackView.distribution = .fillEqually
stackView.alignment = .center
stackView.spacing = 10.0
return stackView
}()
var dataSource = [1,2,3,4]
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
view.addSubview(chooseClass)
chooseClass.translatesAutoresizingMaskIntoConstraints = false
chooseClass.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
chooseClass.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
chooseClass.heightAnchor.constraint(equalToConstant: 50).isActive = true
chooseClass.widthAnchor.constraint(equalToConstant: UIScreen.main.bounds.width).isActive = true
classPicker.heightAnchor.constraint(equalToConstant: 30).isActive = true
chooseClass.addArrangedSubview(classLabel)
chooseClass.addArrangedSubview(classPicker)
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return dataSource.count
}
func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
let label = UILabel()
label.text = String(dataSource[row])
label.font = UIFont.systemFont(ofSize: 12, weight: .medium)
return label
}
}
我使用了 viewForRow
委托,因为在高度为 30 时,使用 titleForRow
的标题在顶部和底部被裁剪。您应该注意对齐问题等。这会满足您的要求 - 将 pickerView
的高度更改为 30,同时保持 stackView
高度。