Picker - ShenYj/ShenYj.github.io GitHub Wiki

Picker

在熟悉SwiftUI 控件的时候发现 Picker的 pickerStyle 设置不同展示样式时有个厉害的地方,除了配置不同样式外还能完成不同样式与之的交互效果

  • 示例代码(关键部分: 系统语言设置)
import SwiftUI

struct ContentView: View {
    
    @State private var isBellSlash: Bool = false
    @State private var isDarkMode: Bool = false
    @State private var selectedColor: Color = .white
    @State private var selectedLanguage: String = "简体中文"
    @State private var languages = ["简体中文", "繁体中文", "英文"]
    
    var body: some View {
        
        NavigationStack {
            
            Form {
                /// 常规设置
                Section {
                    notificationToggleView
                    darkModeToggleView
                } header: {
                    Text("常规设置")
                }
                .padding(.vertical, 3)
                
                /// 个性化
                Section {
                    colorPickerView
                    languagePickerView
                }
                .padding(.vertical, 3)
                
                /// 关于我们
                Section {
                    
                }
                .padding(.vertical, 3)
            }
            .navigationTitle("应用设置")
            .navigationBarTitleDisplayMode(.inline)
        }
    }
    
    /// 消息通知
    private var notificationToggleView: some View {
        Toggle(isOn: $isBellSlash) {
            HStack {
                Image(systemName: "bell")
                    .font(.system(size: 20))
                Text("消息通知")
            }
        }
    }
    /// 暗黑模式
    private var darkModeToggleView: some View {
        Toggle(isOn: $isDarkMode) {
            HStack {
                Image(systemName: "moon.stars")
                    .font(.system(size: 20))
                Text("深色模式")
            }
        }
        .preferredColorScheme(isDarkMode ? .dark : .light)
    }
    
    /// 主题颜色
    private var colorPickerView: some View {
        ColorPicker(selection: $selectedColor) {
            HStack {
                Image(systemName: "paintbrush")
                    .font(.system(size: 20))
                Text("主题颜色")
            }
        }
    }
    /// 系统语言
    private var languagePickerView: some View {
        Picker(selection: $selectedLanguage) {
            ForEach(languages, id: \.self) { language in
                Text(language)
            }
        } label: {
            HStack {
                Image(systemName: "waveform")
                    .font(.system(size: 20))
                Text("系统语言")
            }
        }
        .pickerStyle(.automatic)
    }
}

#Preview {
    ContentView()
}

automatic

默认样式

.

inline

每个选项都与其他视图在同一容器中行内显示

.

menu

对比默认样式十分相似,只有选中项展示时的颜色区别

.

navigationLink

一个由导航链接表示的拣选样式,通过推送列表样式拣选视图来展示选项。

这项就有意思了,做了个子页面跳转,选择完自动返回

..

palette

一种以紧凑元素行展示选项的拾取样式,类似于segment的展示样式

注意按照我当前的图片+文字组合展示表单被这个样式所替代

.

radioGroup

这是一个macOS下的样式,暂时跳过

segmented

跟 palette 几乎看不出区别

wheel

类似于原来 UIKit 中的 UIPickerView 一样的滚动效果

.

⚠️ **GitHub.com Fallback** ⚠️