首页 > 解决方案 > 如何设置 UIPickerView 的宽度

问题描述

我的界面截图

我试图设置 UIPickerView 的宽度,但没有用。例如,我用


 class Coordinator : NSObject,UIPickerViewDelegate,UIPickerViewDataSource{
...
 func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
            
            let view = UIView(frame: CGRect(x:0,y:0,width:128,height:60))
...
return view
}
...
}

上面的代码,只能改变红色块的宽度。我想改变整个选择器的宽度,包括半透明块。


struct CustomPicker : UIViewRepresentable{
...
func makeUIView(context: UIViewRepresentableContext<CustomPicker>) -> UIPickerView {
let picker = UIPickerView(frame: CGRect(x: 0, y: 0, width: 50, height: 60))
return picker
}
}

上面的代码不起作用。

此外,是否有一些功能可以隐藏/删除/自定义半不透明蒙版?等待你的帮助!多谢 :) !

这是完整的代码。

// ContentView

import SwiftUI

struct ContentView: View {
    
    @State var selectedWeight : dataListItemModel = dataListItemModel(label: "1KG", value: 1)
    @State var selectedTimes : dataListItemModel = dataListItemModel(label: "1RM", value: 1)
    
    let timesDataList : [dataListItemModel] = [
        dataListItemModel(label: "1RM", value: 1),
        dataListItemModel(label: "2RM", value: 2),
        dataListItemModel(label: "3RM", value: 3),
    ]
    let weightDataList : [dataListItemModel] = [
        dataListItemModel(label: "1.25KG", value: 1.25),
        dataListItemModel(label: "2.5KG", value: 2.5),
        dataListItemModel(label: "5KG", value: 5),
    ]
    
    var body: some View {
        HStack{
                CustomPicker(selected: self.$selectedWeight,dataList: weightDataList,width: 200)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
// CustomPicker

import SwiftUI
import UIKit


struct dataListItemModel : Identifiable {
    let id : String = UUID().uuidString
    let label : String
    let value : Double
    
    init(label : String,  value : Double)  {
        self.label = label
        self.value = value
    }
    
}



struct CustomPicker : UIViewRepresentable{
    
    @Binding var selected : dataListItemModel

    let dataList : [dataListItemModel]
    let width : CGFloat
    
    func makeCoordinator() -> CustomPicker.Coordinator {
        return CustomPicker.Coordinator(parent1: self)
    }
    
    func makeUIView(context: UIViewRepresentableContext<CustomPicker>) -> UIPickerView {
        let picker = UIPickerView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width/3, height: 60))

        picker.dataSource = context.coordinator
        picker.delegate = context.coordinator
  
//        picker.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        
        return picker
    }
    func updateUIView(_ uiView: UIPickerView, context: UIViewRepresentableContext<CustomPicker>) {
        
    }
    
    class Coordinator : NSObject,UIPickerViewDelegate,UIPickerViewDataSource{
        
        var parent : CustomPicker
        let dataList : [dataListItemModel]
        let width : CGFloat
        
        init(parent1 : CustomPicker) {
            parent = parent1
            dataList = parent1.dataList
            width = parent1.width
        }
        
        func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
            return dataList.count
        }
        
        func numberOfComponents(in pickerView: UIPickerView) -> Int {
//            pickerView.subviews.forEach({
//                // $0.frame = CGRect(x:0,y:0,width:width,height:60)
//1
//                $0.isHidden = $0.frame.height < 1.0
//            })
            return 1
        }
        
        
        func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
            
            let view = UIView(frame: CGRect(x:0,y:0,width:width,height:60))
            let label = UILabel(frame: CGRect(x: 0, y: 0, width: view.bounds.width, height: view.bounds.height))
            
            label.text = dataList[row].label
            label.textColor = .white
            label.textAlignment = .center
            label.font = .systemFont(ofSize: 22,weight:.bold)
            label.adjustsFontSizeToFitWidth = true
            label.numberOfLines = 1
            view.backgroundColor = .red
            
            
            view.addSubview(label)
            
            view.clipsToBounds = true
            view.layer.cornerRadius = 8
            
            return view
        }
        
        
        func pickerView(_ pickerView: UIPickerView, widthForComponent component: Int) -> CGFloat {
            return width
        }
        
        func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat {
            return 60
        }
        
        func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
            self.parent.selected = dataList[row]
        }
        
        
    }
}

class Host : UIHostingController<ContentView>{
    override var preferredStatusBarStyle: UIStatusBarStyle{
        return .lightContent
    }
}


标签: swiftuikit

解决方案


推荐阅读