前言
“千淘萬漉雖辛苦,吹盡狂沙始到金。”在這快速變化的網際網路行業,身邊的朋友有的選擇了勇敢創業,有的則在技術的海洋中默默耕耘。時常在深夜反思,作為一個開發者,我們的價值何在?答案或許就在那行程式碼中,潤物細無聲。以下是我在日常開發中封裝的一個彈窗管理工具——CLPopoverManager,希望能為大家提供一些靈感和幫助。
概述
在移動應用開發中,彈窗作為一種重要的使用者互動方式,使用頻率非常高。無論是提示資訊、廣告展示,還是操作確認,彈窗都扮演著重要角色。然而,如果彈窗的顯示邏輯缺乏合理控制,可能會出現彈窗重疊、順序混亂等問題,極大影響使用者體驗。因此,我開發了CLPopoverManager,旨在為彈窗顯示提供一個統一、可控的管理方案。
功能
- 支援
排隊
、插隊
、替換
、唯一
模式 - 支援優先順序設定
- 支援去重標記
- 支援手勢穿透
- 支援手勢穿透時自動隱藏
- 支援自動旋轉
- 支援隱藏狀態列
- 支援狀態列樣式
- 支援設定介面方向
- 支援夜間模式
原理
彈窗採用偽單例模式管理UIWindow
,內部採用自定義佇列控制顯示順序,對外使用UIViewController
。
使用
自定義UIViewController
繼承CLPopoverController
並且遵守CLPopoverProtocol
協議即可,內部你可以自行實現彈窗相關動畫和UI。
示例程式碼
class CustomPopoverController: CLPopoverController, CLPopoverProtocol {
// 實現彈窗相關邏輯
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
}
private func setupUI() {
// 配置彈窗UI
}
func showAnimation(completion: (() -> Void)? = nil) {
// 顯示動畫
}
func dismissAnimation(completion: (() -> Void)? = nil) {
// 隱藏動畫
}
}
/// 彈出
let popover = CustomPopoverController()
popover.config.popoverMode = .queue
let key = CLPopoverManager.show(popover: popover)
/// 隱藏單個彈窗
CLPopoverManager.dismiss(key)
/// 隱藏所有彈窗
CLPopoverManager.dismissAll()
模式和優先順序
模式
- 排隊模式:如果當前沒有彈窗顯示,則立即顯示;如果有彈窗正在顯示,會進入到等待佇列,後續按照優先順序顯示。
- 插隊模式:無視當前顯示的彈窗,立即顯示,會多個彈窗重疊。
- 替換模式:替換當前顯示的彈窗,立即顯示,會隱藏之前的所有彈窗。
- 唯一模式:替換當前顯示的彈窗,獨佔顯示,會隱藏之前的所有彈窗並且阻止後續所有彈窗。
優先順序
彈窗可以設定優先順序,高優先順序的彈窗將優先顯示。只對進入到等待佇列中的彈窗生效,前面彈窗消失後,會在等待佇列中查詢優先順序高的彈窗優先顯示。
常見問題解答(QA)
為什麼使用 UIViewController
而不是 UIView
?
UIViewController
相比 UIView
能夠提供生命週期相關方法,管理起來更加方便。
為什麼使用 UIWindow
?
UIWindow
可以不入侵專案 UI
,保障不擾亂當前專案的同時,可以實現橫豎屏切換、狀態列樣式等。
為什麼是偽單例模式?
彈窗管理在所有彈窗都銷燬後,會自動銷燬管理者的單例。
為什麼有優先順序的情況還需要這麼多模式?
需求多種多樣,為保障靈活性的同時,還能夠保障彈窗的順序。
結語
透過封裝 CLPopoverManager,我們能夠更好地管理 iOS 應用中的彈窗顯示邏輯,提升使用者體驗,保障應用的穩定性。希望這個工具能夠幫助到大家,同時也歡迎各位提出寶貴的意見和建議。
開發是一種藝術,不僅需要技術的積累,更需要靈感和創造力。願我們在追逐技術之巔的路上,能夠彼此激勵,共同成長。願所有的開發者都能在自己的程式碼世界中找到那一片屬於自己的淨土。
PS:心中感慨良多,奈何腹中無墨,一個字總結——懶。順便附上github,有興趣的可以去看看。