当使用Picker.pickerStyle(WheelPickerStyle())时, Select 器占用的水平空间似乎是固定的.在下图中,选取器框架(从其较浅的 colored颜色 可以看出)比其元素所需的更大.

Screenshot

我试图使选取器的宽度与它包含的最长选项的宽度相同,类似于Text()个视图"包装"其文本的方式,并且仅与其中的文本所需的大小相同.

对于SwiftUI中的轮式捡拾器,我该如何实现这一点?

推荐答案

一个解决方案看起来有点复杂,因为选取器不是本机SwiftUI控件,但后端有UIPickerView个,所以我们需要将前面提到的to get rid of compression containsto calculate most long label结合起来,并显式压缩选取器.

demo

主要部分是

@State private var maxWidth = CGFloat.zero
@State private var width = CGFloat.infinity

var body: some View {
    Picker("", selection: $selection) {
        ForEach( ... 

           // Row/Label view is here

            .background(GeometryReader {
                Color.clear.preference(key: ViewWidthKey.self,
                    value: $0.frame(in: .local).size.width)
            })
            .onPreferenceChange(ViewWidthKey.self) {
                self.maxWidth = max($0, maxWidth)
                width = max($0, maxWidth)
            }
        }
    }
    .pickerStyle(.wheel)
    .frame(maxWidth: width + 2 * 20 /* padding on both sides */)
}

使用Xcode 13.4/iOS 15.5测试

Test code on GitHub

Swift相关问答推荐

为什么在Swift属性Wrapper中需要类型注释?

什么是Swift Concurrency中任务组的正常退出

变量捕获:变量在函数闭包中的行为

MyApp类型不符合协议App''''

如何在visionOS上删除PhotosPicker背景 colored颜色 ?

从后台线程获取@发布属性的值(不更改它)是正确的吗?

如何在AudioKit中实现自定义音效 node ?

如何在每天午夜重置布尔值

在数组中查找最大y值的x值

如何在 Vapor 中制作可选的查询过滤器

Observable.create 捕获行为

在PrimitiveSequence上引用实例方法xxx需要类型A和any B等效

SwiftUI:按钮的圆形边缘的边框尺寸加倍

SwiftUI - Select 器没有 Select 值

SwiftUI Preview 不适用于 Core Data

如何将回调传递给 View init

`IndexSet` 永远不会是空的?

Swift中switch 盒的详尽条件

Swift:如何从函数返回类类型

Xcode6 中的 Swift 类与 Cocoa Touch 类