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

问小白

问小白是一个基于 DeepSeek R1 模型的智能对话平台,专为用户提供高效、贴心的对话体验。实时在线,支持深度思考和联网搜索。免费不限次数,帮用户写作、创作、分析和规划,各种任务随时完成!

Project Cover

白日梦AI

白日梦AI提供专注于AI视频生成的多样化功能,包括文生视频、动态画面和形象生成等,帮助用户快速上手,创造专业级内容。

Project Cover

有言AI

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

Project Cover

讯飞绘镜

讯飞绘镜是一个支持从创意到完整视频创作的智能平台,用户可以快速生成视频素材并创作独特的音乐视频和故事。平台提供多样化的主题和精选作品,帮助用户探索创意灵感。

Project Cover

讯飞文书

讯飞文书依托讯飞星火大模型,为文书写作者提供从素材筹备到稿件撰写及审稿的全程支持。通过录音智记和以稿写稿等功能,满足事务性工作的高频需求,帮助撰稿人节省精力,提高效率,优化工作与生活。

Project Cover

阿里绘蛙

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

Project Cover

Trae

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

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