SwiftUI Picker 手动触发扩展

Posted

技术标签:

【中文标题】SwiftUI Picker 手动触发扩展【英文标题】:SwiftUI Picker manually trigger expansion 【发布时间】:2021-01-03 11:43:29 【问题描述】:

我有以下观点:

Swift 代码如下所示:

struct TestView: View 
    let options = [" ", "1", "2", "3", "4", "5", "6"]
    @State var selectedIndex: Int = 0

    var body: some View 
        HStack(spacing: 0) 
            Text("One")

            Spacer()

            Picker(selection: $selectedIndex, label: Text(options[selectedIndex])) 
                ForEach(0 ..< options.count) 
                    Text(options[$0])
                
            
            .background(Color.red)
            .pickerStyle(MenuPickerStyle())
        
        .padding(EdgeInsets(top: 0, leading: 16, bottom: 0, trailing: 16))
        .background(Color.yellow)
    

点击红色方块时,将打开 Picker:

如何将红色矩形的触摸区域扩展到整个黄色区域?

【问题讨论】:

您只需要在您的 selectedIndex 变量中分配新的选择值 “开放”是什么意思?选择器在 List 里面吗? 你能添加一个更详细/可重现的例子吗? 我不认为在视图上显示 Picker 是一个好主意。而是像 ios Calenadar 中的那样展开该行。这个***.com/questions/64919284/… 可能会对你有所帮助。问题是我的,如果您的 SuperView 不是列表,它会完美运行。 @pawello2222 我已经更新了问题,包括屏幕截图和可复制的视图 【参考方案1】:

不确定这正是您所追求的,但请尝试一下(初始视图是“空白”黄色条):

import SwiftUI

struct PickerTestView: View 
    let options = [" ", "1", "2", "3", "4", "5", "6"]
    let optionNames = [" ", "One", "Two", "Three", "Four", "Five", "Six"]
    @State var selectedIndex: Int = 0

    var body: some View 
        ZStack 
            HStack(spacing: 0) 
                Text(optionNames[selectedIndex])
                Spacer()
            
            .padding(EdgeInsets(top: 0, leading: 16, bottom: 0, trailing: 16))
            .background(Color.yellow)
            HStack(spacing: 0) 
                Picker(selection: $selectedIndex, label: Text(" ").frame(maxWidth: .infinity), content: 
                    ForEach(0 ..< options.count) 
                        Text(options[$0])
                    
                )
                .pickerStyle(MenuPickerStyle())
            
        
    



struct PickerTestView_Previews: PreviewProvider 
    static var previews: some View 
        PickerTestView()
    

发布时:

点击黄色条上的任意位置:

选择“3”后:

【讨论】:

Picker 显示当前选择的选项而不是 iOS15 中的标签,因此选择器不再不可见。【参考方案2】:

@DonMag 的答案在 iOS 15 上停止工作。这是一个更新的答案,它确实有效。从技术上讲,它使用 Slider,但行为是相同的。而是使用Menu

struct PickerTestView: View 
    let options = [" ", "1", "2", "3", "4", "5", "6"]
    let optionNames = [" ", "One", "Two", "Three", "Four", "Five", "Six"]
    @State var selectedIndex: Int = 0

    var body: some View 
        ZStack 
            HStack(spacing: 0) 
                Text(optionNames[selectedIndex])
                Spacer()
            
            .padding(EdgeInsets(top: 0, leading: 16, bottom: 0, trailing: 16))
            .background(Color.yellow)

            HStack(spacing: 0) 
                Menu 
                    ForEach(0 ..< options.count) 
                        let index = $0
                        Button("\(options[index])") 
                            selectedIndex = index
                        
                    
                 label: 
                    Label("", image: "")
                        .labelStyle(TitleOnlyLabelStyle())
                        .frame(maxWidth: .infinity)
                
            
        
    



struct PickerTestView_Previews: PreviewProvider 
    static var previews: some View 
        PickerTestView()
    

让我们看看 Apple 什么时候决定中断这个实现。

【讨论】:

以上是关于SwiftUI Picker 手动触发扩展的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 为啥 Picker 上的输入不起作用?

在 SwiftUI 中,Picker 扩展为占据 HStack 内的整个空间

MenuPicker 选中 SwiftUI 时排序

SwiftUI 中的一排 Picker ***,为啥拖动滚动区域从屏幕上的 Picker 控件偏移?

SwiftUI:以编程方式设置 Picker 的值

SwiftUI Segmented Picker 元素为灰色且禁用