Swift 制作水平UIPickerView

Swift 制作水平UIPickerView,swift,uipickerview,Swift,Uipickerview,我正在试着做一个水平的UIPickerView。但我有一些宽度方面的问题。正如你可以在上面的图片顶部看到的那样 我希望PickerView的宽度为=view.frame.size.width,但由于某些原因,它保持非常小。在我的代码中,我有: let cityPicker = UIPickerView() var rotationAngle: CGFloat! let width:CGFloat = 100 let height:CGFloat = 100 override func view

我正在试着做一个水平的UIPickerView。但我有一些宽度方面的问题。正如你可以在上面的图片顶部看到的那样

我希望PickerView的宽度为=view.frame.size.width,但由于某些原因,它保持非常小。在我的代码中,我有:

let cityPicker = UIPickerView()
var rotationAngle: CGFloat!
let width:CGFloat = 100
let height:CGFloat = 100

override func viewDidLoad() {
        super.viewDidLoad()
cityPicker.delegate = self
        cityPicker.dataSource = self
        cityPicker.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: 50)
        self.view.addSubview(cityPicker)
        rotationAngle = -90 * (.pi/180)
        cityPicker.transform = CGAffineTransform(rotationAngle: rotationAngle)

        }

  func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return byer.count
    } 

    func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat {
        return 100
    }

    func pickerView(_ pickerView: UIPickerView, widthForComponent component: Int) -> CGFloat {
        return 100
    }

    func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
        let view = UIView()
        view.frame = CGRect(x: 0, y: 0, width: width, height: height)

        let label = UILabel()
        label.frame = CGRect(x: 0, y: 0, width: width, height: height)
        label.textAlignment = .center
        label.font = UIFont (name: "Baskerville-Bold", size: 30)
        label.text = byer[row]
        view.addSubview(label)

        view.transform = CGAffineTransform(rotationAngle: 90 * (.pi/180))
        return view
    }

有人知道我做错了什么吗?

你应该使用自动布局,但是如果你想手动布局,你不能在
viewDidLoad
中使用视图的框架。此时,帧将等于故事板或nib文件中的内容,并且不会反映实际的设备或视图层次结构。您应该将手动调整大小逻辑放入
viewdilayoutsubviews
中。调用此函数时,视图的大小正确,可以使用它设置子视图

var rotationAngle : CGFloat!
在你的视野里

在类中编写此函数

我们还需要在旋转pickerview时旋转标签,现在在viewForRow方法中。(这些是Pickerview委托方法。)

在viewDidLoad中调用rotatePickerView函数,并将pickerview作为参数输入,完成,谢谢;)


我不知道@Josh Homann所说的“只使用自动布局”是什么意思,但我必须创建一个旋转选择器

private let horizontalPickerView: UIPickerView = {
    let view = UIPickerView()
    view.translatesAutoresizingMaskIntoConstraints = false
    view.showsSelectionIndicator = false
    view.transform = CGAffineTransform(rotationAngle: -90 * (.pi / 180))
    return view
}()
然后将其约束设置为经验计算

horizontalPickerView.widthAnchor.constraint(equalToConstant: screenWidth),
horizontalPickerView.heightAnchor.constraint(equalToConstant: 300),
horizontalPickerView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
horizontalPickerView.centerYAnchor.constraint(equalTo: mainButton.topAnchor, constant: -32)
并在UIPickerViewDelegate方法中设置项目宽度(实际高度)

public func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat {
    100
}
得到这个

private let horizontalPickerView: UIPickerView = {
    let view = UIPickerView()
    view.translatesAutoresizingMaskIntoConstraints = false
    view.showsSelectionIndicator = false
    view.transform = CGAffineTransform(rotationAngle: -90 * (.pi / 180))
    return view
}()
horizontalPickerView.widthAnchor.constraint(equalToConstant: screenWidth),
horizontalPickerView.heightAnchor.constraint(equalToConstant: 300),
horizontalPickerView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
horizontalPickerView.centerYAnchor.constraint(equalTo: mainButton.topAnchor, constant: -32)
public func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat {
    100
}