Project Icon

Setting

Swift框架轻松构建iOS和macOS设置界面

Setting是一个Swift框架,用于构建iOS和macOS应用的设置界面。它提供简洁的语法,支持嵌套页面和分组,具备搜索功能,与SwiftUI和AppStorage集成。框架内置开关、按钮、滑块等组件,可动态显示隐藏元素,并支持自定义SwiftUI视图。Setting适配iOS 15+和macOS Monterey以上版本,可通过Swift Package Manager安装。

头部图片

创建精美的偏好设置面板。

  • 简单而强大的语法(由结果构建器驱动)。
  • 创建嵌套页面和分组。
  • 完全可搜索。
  • 与SwiftUI和AppStorage原生集成。
  • 提供预制组件:开关、按钮、滑块等...
  • 使用原生SwiftUI修饰符设置组件样式。
  • 动态显示和隐藏组件。
  • 添加自定义SwiftUI视图。
  • 适用于iOS和macOS。

使用Setting创建的视图截图

嵌套页面和搜索结果的截图

安装

Setting可通过Swift包管理器获得。需要iOS 15+或macOS Monterey及以上版本。

https://github.com/aheze/Setting

使用方法

import Setting
import SwiftUI

struct PlaygroundView: View {
    /// Setting支持`@State`、`@AppStorage`、`@Published`等!
    @AppStorage("isOn") var isOn = true

    var body: some View {
        /// 使用`SettingStack`开始。
        SettingStack {
            /// 这是主设置页面。
            SettingPage(title: "Playground") {
                /// 使用分组来组织组件。
                SettingGroup(header: "主分组") {
                    /// 使用任何预制组件...
                    SettingToggle(title: "此值已持久化!", isOn: $isOn)

                    /// ...或定义你自己的组件!
                    SettingCustomView {
                        Image("Logo")
                            .resizable()
                            .aspectRatio(contentMode: .fit)
                            .frame(width: 160)
                            .padding(20)
                    }

                    /// 在`SettingPage`内嵌套`SettingPage`!
                    SettingPage(title: "高级设置") {
                        SettingText(title: "我会显示在下一页!")
                    }
                }
            }
        }
    }
}

结果,生成的设置页面。点击"高级设置"会呈现新页面。

示例

示例应用中查看更多示例。

struct PlaygroundView: View {
    var body: some View {
        SettingStack {
            SettingPage(title: "Playground") {
                SettingGroup {
                    SettingText(title: "你好!")
                }
            }
        }
    }
}

渲染的设置视图,显示"你好!"标签

SettingStack {
    SettingPage(title: "Playground") {
        SettingGroup {
            SettingText(title: "你好!")
        }

        SettingGroup {
            SettingPage(title: "第一页") {}
                .previewIcon("star")

            SettingPage(title: "第二页") {}
                .previewIcon("sparkles")

            SettingPage(title: "第三页") {}
                .previewIcon("leaf.fill")
        }
    }
}

渲染的设置视图,显示3个行链接

struct PlaygroundView: View {
    @AppStorage("isOn") var isOn = true
    @AppStorage("value") var value = Double(5)

    var body: some View {
        SettingStack {
            SettingPage(title: "Playground") {
                SettingGroup {
                    SettingToggle(title: "开启", isOn: $isOn)
                }

                SettingGroup(header: "滑块") {
                    SettingSlider(
                        value: $value,
                        range: 0 ... 10
                    )
                }
            }
        }
    }
}

渲染的设置视图,显示开关和滑块

struct PlaygroundView: View {
    @AppStorage("index") var index = 0

    var body: some View {
        SettingStack {
            SettingPage(title: "Playground") {
                SettingGroup {
                    SettingPicker(
                        title: "选择器",
                        choices: ["A", "B", "C", "D"],
                        selectedIndex: $index
                    )
                    SettingPicker(
                        title: "带菜单的选择器",
                        choices: ["A", "B", "C", "D"],
                        selectedIndex: $index,
                        choicesConfiguration: .init(
                            pickerDisplayMode: .menu
                        )
                    )
                }
            }
        }
    }
}

带选择器的设置视图

SettingStack {
    SettingPage(title: "Playground") {
        SettingCustomView {
            Color.blue
                .opacity(0.1)
                .cornerRadius(12)
                .overlay {
                    Text("在这里放任何东西!")
                        .foregroundColor(.blue)
                        .font(.title.bold())
                }
                .frame(height: 150)
                .padding(.horizontal, 16)
        }
    }
}

带"在这里放任何东西!"标签的设置视图

注意事项

  • 如果多个组件具有相同的标题,请使用id参数确保一切正确渲染。
SettingText(id: "公告1", title: "你好!")
SettingText(id: "公告2", title: "你好!")
  • Setting支持if-else语句!
SettingToggle(title: "开启", isOn: $isOn)

if isOn {
    SettingText("我已开启!")
}
  • 将组件包装在SettingCustomView中以自定义样式。
SettingCustomView {
    SettingText(title: "我是粗体!")
        .bold()
}
  • 想要将Setting拆分成多个变量/文件吗?只需使用@SettingBuilder
struct ContentView: View {
    var body: some View {
        SettingStack {
            SettingPage(title: "设置") {
                general
                misc
            }
        }
    }
    
    @SettingBuilder var general: some Setting {
        SettingPage(title: "通用") {
            SettingText(title: "通用设置")
        }
    }
    
    @SettingBuilder var misc: some Setting {
        SettingPage(title: "杂项") {
            SettingText(title: "杂项设置")
        }
    }
}
  • 需要在AppStorage中存储自定义结构体?查看@IanKeen的精彩代码片段

  • 你可以传入一个自定义的SettingViewModel实例以实现更精细的控制。

struct PlaygroundView: View {
    @StateObject var settingViewModel = SettingViewModel()

    var body: some View {
        SettingStack(settingViewModel: settingViewModel) {
            SettingPage(title: "Playground") {
                SettingGroup {
                    SettingText(title: "欢迎使用Setting!")
                }
            }
        } customNoResultsView: {
            VStack(spacing: 20) {
                Image(systemName: "xmark")
                    .font(.largeTitle)

                Text("没有找到'\(settingViewModel.searchText)'的结果")
            }
            .frame(maxWidth: .infinity, maxHeight: .infinity)
        }
    }
}

带"在这里放任何东西!"标签的设置视图


社区

作者贡献需要帮助?
Setting由aheze制作。欢迎所有贡献。只需fork仓库,然后提交拉取请求。提出issue或加入Discord服务器。你也可以在Twitter上联系我。

许可证

MIT License

Copyright (c) 2023 A. Zheng
特此免费授予任何获得本软件及相关文档文件(以下简称"软件")副本的人无限制地处理该软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售该软件的副本,以及允许获得该软件的人这样做,但需遵守以下条件:

上述版权声明和本许可声明应包含在软件的所有副本或重要部分中。

本软件按"原样"提供,不附带任何形式的明示或暗示的保证,包括但不限于对适销性、特定用途适用性和非侵权性的保证。在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论这些追责来自合同、侵权或其它行为中,还是产生于、源于或有关于本软件以及本软件的使用或其它处置。
项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

稿定AI

稿定设计 是一个多功能的在线设计和创意平台,提供广泛的设计工具和资源,以满足不同用户的需求。从专业的图形设计师到普通用户,无论是进行图片处理、智能抠图、H5页面制作还是视频剪辑,稿定设计都能提供简单、高效的解决方案。该平台以其用户友好的界面和强大的功能集合,帮助用户轻松实现创意设计。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号