iOS自定義應用設置頁面
引言
我們知道,當安裝了一個iOS應用程序後,在系統的設置中,就會爲此應用生成一個單獨的設置模塊,可以在其中控制應用的網絡權限、推送權限等系統設置項。除了系統功能的相關設置外,其實應用程序也有許多自身設置的需求,例如應用緩存數據的設置、應用主題的設置以及用戶賬戶的設置等。通常,應用自身的設置會由開發者自行開發,在應用內提供頁面來承載,這使得應用的設置被割裂成了兩部分。其實,iOS系統的設置頁面也提供了不同應用進行定製的能力,例如系統的Safari瀏覽器應用,其設置頁面如下:
本篇文章將討論應用自定義系統設置頁面的技術細節,某些場景下,將應用設置項合併入系統設置可以提供給用戶更一致的使用體驗。
從一個小示例開始
應用本身設置項的配置需要定義在一個plist文件中。在項目中可以直接新建一個Settings Bundle文件,如下:
生成的Bundle中包含一個國際化文件和一個Root.plist文件,國際化的文件我們暫不關心,其用來根據用戶本地的語言環境來映射不同語言的字符串。Root.plist文件是配置設置項的核心文件。其內容如下:
模版中默認定義了4個item,分別用來顯示一個分組頭、輸入框、開關和滑塊組件。效果如下:
每個配置項的意義和用法,我們後續在詳細介紹。可以看到,通過Plist文件的配置,我們可以在設置頁面中添加許多可用戶交互的組件。要讀取用戶設置情況也非常簡單,只需要讀取此Bundle文件中的Root.plist文件即可,例如:
let path = Bundle.main.path(forResource: "Settings", ofType: "bundle")
let settings = NSDictionary(contentsOfFile: path!.appending("/Root.plist"))
需要注意,Plist文件中的鍵與在Xcode中看到的鍵值並不一致,Xcode對鍵值進行了可讀化,你可以以文件的方式查看,即可看到真正的鍵名,例如上面的設置文件內容爲:
Plist文件配置項詳解
Root.plist文件最外層可配置鍵
- PreferenceSpecifiers
此鍵是必須的,設置爲一個數組,數組中每個具體的元素即是配置設置項的每一項。數組的順序會決定設置項的排序。
- StringsTable
設置用來進行語言本地化的文件名。
- ApplicationGroupContainerIdentifier
用來設置Group標識,用來在小組件等擴展中訪問此設置。
配置的核心是PreferenceSpecifiers,其配置的數組中的元素根據不同的type會渲染不同的組件,能支持的類型包括如下幾種:
1. PSTextFieldSpecifier:文本輸入框。
2.PSTitleValueSpecifier: 只讀的標題,只能用來顯示信息。
3.PSToggleSwitchSpecifier:開關。
3.PSSliderSpecifier:滑塊。
4.PSMultiValueSpecifier:多選列表,點擊後會跳轉到一個新的頁面,其中提供一組選項供選擇。
5.PSGroupSpecifier:分組,用來對選項進行分組,此處可以理解爲分組的分割線,能夠設置標題。
6.PSRadioGroupSpecifier: 此類型也用來設置選則列表,與PSMultiValueSpecifier不同的是其不會跳轉到新的頁面,而是直接在當前頁面展示列表。
7.PSChildPaneSpecifier: 此類型用來設置一個子頁面,其可以配置另一個Plist文件來展示子頁面的選項。
下面將逐一對這些類型進行介紹。
PSGroupSpecifier
用來渲染一個分組,可配置字段:
- Title
設置分組標題。
- FooterText
設置尾部文案。
- SupportedUserInterfaceIdioms
設置只在某些設備上顯示,例如”iPhone“
配置效果:
PSChildPaneSpecifier
- Title
設置標題。
- File
子設置頁面Plist文件名。
- SupportedUserInterfaceIdioms
設置只在某些設備上顯示,例如”iPhone“
PSRadioGroupSpecifier
直接展開的選擇列表。
- Title
設置標題。
- FooterText
設置尾部文案。
- Key
唯一標識。
- DefaultValue
默認的選中項。
- Values
一組選項的值。
- Titles
一組選項顯示的標題。
- DisplaySortedByTitle
布爾值,選項是否根據標題進行排序。
- SupportedUserInterfaceIdioms
設置只在某些設備上顯示,例如”iPhone“
配置效果:
PSMultiValueSpecifier
- Title
設置標題。
- Key
唯一標識。
- DefaultValue
默認的選中項。
- Values
一組選項的值。
- Titles
一組選項顯示的標題。
- ShortTitles
配置一組短標題,設置後會顯示短標題,點擊後進入新的頁面展示長內容。
- DisplaySortedByTitle
布爾值,選項是否根據標題進行排序。
- SupportedUserInterfaceIdioms
設置只在某些設備上顯示,例如”iPhone“
PSTextFieldSpecifier
文本輸入框。
- Title
設置標題。
- Key
唯一標識。
- DefaultValue
默認的值。
- IsSecure
是否加密。
- KeyboardType
彈出的鍵盤類型。
- AutocapitalizationType
自動大小寫模式。
- AutocorrectionType
自動拼寫糾正。
- SupportedUserInterfaceIdioms
設置只在某些設備上顯示,例如”iPhone“
PSTitleValueSpecifier
- Title
設置標題。
- Key
唯一標識。
- DefaultValue
顯示的值。
- Values
存儲在數據庫中的一組值。
- Titles
存儲在數據庫中的一組key。
- SupportedUserInterfaceIdioms
設置只在某些設備上顯示,例如”iPhone“
PSSliderSpecifier
- Key
唯一標識。
- DefaultValue
默認值。
- MinimumValue
滑塊的最小值。
- MaximumValue
滑塊的最大值。
- MinmumValueImage
最小值一側顯示的圖片。
- MaximumValueImage
最大值一側顯示的圖片。
- SupportedUserInterfaceIdioms
設置只在某些設備上顯示,例如”iPhone“
PSToggleSwitchSpecifier
- Title
設置標題。
- Key
唯一標識。
- DefaultValue
默認開關狀態。
- TrueValue
開關開啓時綁定的值,不會顯示。
- FalseValue
開關關閉時綁定的值,不會顯示。
- SupportedUserInterfaceIdioms
設置只在某些設備上顯示,例如”iPhone“