UIPickerView(单元格大小)

UIPickerView (size of cells)

我正在尝试制作水平 UIPivkerView。我做了一切,但我不明白如何设置单元格的大小,因为有些单词太长了。我试着学习每个单词的长度,并根据它设置单元格大小。但这对我不起作用。我注意到如果我也按比例增加单元格的大小和宽度,我可以增加单元格的大小。

我需要一个 make PickerView50 width50 height 类似,但我不知道如何处理单元格。

如果我设置值 85 我得到这个:

如果设置50:

import UIKit

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
    var data = ["Hello", "WorldWorld", "Of", "PickerPickerPicker", "View"]

    let viewPicker = UIPickerView()
    var rotationAngele: CGFloat!

    var width: CGFloat = 85
    var height: CGFloat = 85
    //var width: CGFloat!

    override func viewDidLoad() {
        super.viewDidLoad()

        viewPicker.delegate = self
        viewPicker.dataSource = self

        viewPicker.layer.borderColor = UIColor.black.cgColor
        viewPicker.layer.borderWidth = 1.5

        // Rotation
        rotationAngele = -90 * (.pi / 180)
        viewPicker.transform = CGAffineTransform(rotationAngle: rotationAngele)

        //width = data[4].widthOfString(usingFont: UIFont(name:"verdana", size: 24.0)!)

        // Create
        viewPicker.frame = CGRect(x: 0 - 150, y: 0, width: view.frame.width + 300, height: 85)
        viewPicker.center = self.view.center

        self.view.addSubview(viewPicker)
    }

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

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

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

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

    func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {

        //width = data[row].widthOfString(usingFont: UIFont(name:"verdana", size: 24.0)!)

        let view = UIView()
        view.frame = CGRect(x: 0, y: 0, width: 150, height: 150)

        let label = UILabel()
        label.frame = CGRect(x: 0, y: 0, width: 150, height: 150)

        label.textAlignment = .center
        label.font = UIFont(name:"verdana", size: 24.0)!
        label.text = data[row]
        view.addSubview(label)

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

        return view
    }
}

////////////////////////////////////////////////////
extension String {
    func widthOfString(usingFont font: UIFont) -> CGFloat {

        let fontAttributes = [NSAttributedStringKey.font: font]
        let size = self.size(withAttributes: fontAttributes)
        return size.width
    }

    func heightOfString(usingFont font: UIFont) -> CGFloat {
        let fontAttributes = [NSAttributedStringKey.font: font]
        let size = self.size(withAttributes: fontAttributes)
        return size.height
    }
}

好的,当您通过应用变换旋转 UIPickerView 时,当您指定组件宽度时,您实际上指定了 rowHeight。

如果您检查视图并不清楚,但如果您记录帧大小,您就会明白。

所以你应该设置 pickerView:rowHeightForComponent 使其足够宽

func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat {
    return 300 // you can calculate this based on your container view or window size
}

此外,您还可以使用 intrinsicContentSizeUILabel 来确定标签的正确大小并相应地更新其框架以确保标签也正确呈现。

 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: 150, height: 30)

    let label = UILabel()
    label.frame = CGRect(x: 0, y: 0, width: 150, height: 30)

    label.textAlignment = .center
    label.font = UIFont(name:"verdana", size: 24.0)!
    label.text = data[row]
    let updatedLabelSize = label.intrinsicContentSize
    dump(updatedLabelSize)
    label.frame = CGRect(x: 0, y: 0, width: updatedLabelSize.width, height: 30)
    view.frame = CGRect(x: 0, y: 0, width: updatedLabelSize.width, height: 30)
    view.addSubview(label)

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

    return view
}

下面是 UIPickerView 转换后的实际样子。 红框是改造后的,你看到的东西 蓝色高亮为实框