Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Compose beautiful preference panels.

License

NotificationsYou must be signed in to change notification settings

aheze/Setting

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Header image

Compose beautiful preference panels.

  • Simple but powerful syntax (powered byresult builders).
  • Create nested pages and groups.
  • Fully searchable.
  • Native integration with SwiftUI and AppStorage.
  • Comes with pre-made components: Toggle, Button, Slider, etc...
  • Style components with native SwiftUI modifiers.
  • Show and hide components dynamically.
  • Add your own custom SwiftUI views.
  • Works on iOS and macOS.

Screenshots of views created with Setting

Screenshots of a nested page and search results

Installation

Setting is available via theSwift Package Manager. Requires iOS 15+ or macOS Monterey and up.

https://github.com/aheze/Setting

Usage

import Settingimport SwiftUIstructPlaygroundView:View{    /// Setting supports `@State`, `@AppStorage`, `@Published`, and more!@AppStorage("isOn")varisOn=truevarbody:someView{        /// Start things off with `SettingStack`.SettingStack{            /// This is the main settings page.SettingPage(title:"Playground"){                /// Use groups to group components together.SettingGroup(header:"Main Group"){                    /// Use any of the pre-made components...SettingToggle(title:"This value is persisted!", isOn: $isOn)                    /// ...or define your own ones!SettingCustomView{Image("Logo").resizable().aspectRatio(contentMode:.fit).frame(width:160).padding(20)}                    /// Nest `SettingPage` inside other `SettingPage`s!SettingPage(title:"Advanced Settings"){SettingText(title:"I show up on the next page!")}}}}}}

The result, a generated settings page. Clicking on "Advanced Settings" presents a new page.

Examples

View more examples in theexample app.

structPlaygroundView:View{varbody:someView{SettingStack{SettingPage(title:"Playground"){SettingGroup{SettingText(title:"Hello!")}}}}}

Settings view rendered with "Hello!" label

SettingStack{SettingPage(title:"Playground"){SettingGroup{SettingText(title:"Hello!")}SettingGroup{SettingPage(title:"First Page"){}.previewIcon("star")SettingPage(title:"Second Page"){}.previewIcon("sparkles")SettingPage(title:"Third Page"){}.previewIcon("leaf.fill")}}}

Settings view rendered with 3 row links

structPlaygroundView:View{@AppStorage("isOn")varisOn=true@AppStorage("value")varvalue=Double(5)varbody:someView{SettingStack{SettingPage(title:"Playground"){SettingGroup{SettingToggle(title:"On", isOn: $isOn)}SettingGroup(header:"Slider"){SettingSlider(                        value: $value,                        range:0...10)}}}}}

Settings view rendered with toggle and slider

structPlaygroundView:View{@AppStorage("index")varindex=0varbody:someView{SettingStack{SettingPage(title:"Playground"){SettingGroup{SettingPicker(                        title:"Picker",                        choices:["A","B","C","D"],                        selectedIndex: $index)SettingPicker(                        title:"Picker with menu",                        choices:["A","B","C","D"],                        selectedIndex: $index,                        choicesConfiguration:.init(                            pickerDisplayMode:.menu))}}}}}

Settings view rendered with picker

SettingStack{SettingPage(title:"Playground"){SettingCustomView{Color.blue.opacity(0.1).cornerRadius(12).overlay{Text("Put anything here!").foregroundColor(.blue).font(.title.bold())}.frame(height:150).padding(.horizontal,16)}}}

Settings view rendered with "Put anything here!" label

Notes

  • If multiple components have the same title, use theid parameter to make sure everything gets rendered correctly.
SettingText(id:"Announcement 1", title:"Hello!")SettingText(id:"Announcement 2", title:"Hello!")
  • Setting comes withif-else support!
SettingToggle(title:"Turn on", isOn: $isOn)if isOn{SettingText("I'm turned on!")}
  • Wrap components inSettingCustomView to style them.
SettingCustomView{SettingText(title:"I'm bold!").bold()}
  • Want to split up a Setting into multiple variables/files? Just use@SettingBuilder.
structContentView:View{varbody:someView{SettingStack{SettingPage(title:"Settings"){                general                misc}}}@SettingBuildervargeneral:someSetting{SettingPage(title:"General"){SettingText(title:"General Settings")}}@SettingBuildervarmisc:someSetting{SettingPage(title:"Misc"){SettingText(title:"Misc Settings")}}}
  • Need to store custom structs inAppStorage? Check out @IanKeen's awesomegist!

  • You can pass in a customSettingViewModel instance for finer control.

structPlaygroundView:View{@StateObjectvarsettingViewModel=SettingViewModel()varbody:someView{SettingStack(settingViewModel: settingViewModel){SettingPage(title:"Playground"){SettingGroup{SettingText(title:"Welcome to Setting!")}}} customNoResultsView:{VStack(spacing:20){Image(systemName:"xmark").font(.largeTitle)Text("No results for '\(settingViewModel.searchText)'")}.frame(maxWidth:.infinity, maxHeight:.infinity)}}}

Settings view rendered with "Put anything here!" label


Community

AuthorContributingNeed Help?
Setting is made byaheze.All contributions are welcome. Justfork the repo, then make a pull request.Open anissue or join theDiscord server. You can also ping me onTwitter.

License

MIT LicenseCopyright (c) 2023 A. ZhengPermission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the "Software"), to dealin the Software without restriction, including without limitation the rightsto use, copy, modify, merge, publish, distribute, sublicense, and/or sellcopies of the Software, and to permit persons to whom the Software isfurnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included in allcopies or substantial portions of the Software.THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THEAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHERLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THESOFTWARE.

[8]ページ先頭

©2009-2025 Movatter.jp