Swift UIPickerview高度更改不起作用。

3
我知道这个问题已经被问过多次了,但我已经按照stackoverflow上的大部分链接尝试了,但没有一个答案有效。还有一些地方说只允许使用三种高度,而且都在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)

在此输入图片描述

我也尝试了这个链接中的答案,但没有成功 如何更改UIPickerView的高度


@RakeshaShastri,除了我在视图中添加的两个约束条件之外,没有其他锚点。就像这样将其添加到视图中:self.view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-16-[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": chooseClass]))。 - Shivam Pokhriyal
@RakeshaShastri 这只是一个标签,你可以从附加的截图中猜到。顺便说一下,我已经在问题本身中添加了代码。 - Shivam Pokhriyal
@RakeshaShastri 请查看截图并阅读问题,我想让UIPickerView的高度小一些,例如30,我已经进行了更改,但是现在它没有起作用,正如您在截图中所看到的那样,选择器显示为大型,我想要减小这个高度。无论我如何实现,无论是更改stackview的高度还是任何其他可能的解决方法,我都希望减小UIPickerView的高度。此外,我已经在问题本身中明确说明了我尝试过这些代码来实现我想要的结果,但没有得到预期的结果,即小高度的UIPicker - Shivam Pokhriyal
你是指行高吗?选择器中每个单元格的高度? - Rakesha Shastri
@RakeshaShastri 我的意思是整个UIPickerView的高度,而不是行高。我没有在任何地方使用“行”这个词。请建议一种减小整个UIPickerView高度的方法。 - Shivam Pokhriyal
显示剩余4条评论
1个回答

3
你需要更改stackView的对齐方式为.center。然后,只要满足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 委托,因为使用 titleForRow 时,高度为30的标题在顶部和底部被裁剪。您需要注意对齐问题等。这将实现您的要求-将 pickerView 的高度更改为30,同时保持 stackView 的高度。

@ShivamPokhriyal 是的。你遇到了什么错误。不要更改我的答案中的任何内容。只需创建一个类的实例并使用它来查看它是否正常工作即可。你在问题中添加了约束、框架等,这些都是不必要的。 - Rakesha Shastri
同时,在创建Stackview时,是否需要两次将子视图添加到其中,第一次是在创建时,第二次是在添加约束后?尽管这并没有解决问题。 - Shivam Pokhriyal
@ShivamPokhriyal 我已经将标签和选择器添加到堆栈视图中。我不明白你在说什么。 - Rakesha Shastri
@ShivamPokhriyal 你能先直接运行代码并检查一下吗? - Rakesha Shastri
1
让stackView: UIStackView = UIStackView(arrangedSubviews: [self.classLabel, self.classPicker])这一行和chooseClass.addArrangedSubview(classLabel)、chooseClass.addArrangedSubview(classPicker)这两行是必要的。请给我一些时间来运行你的代码。 - Shivam Pokhriyal
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接