SwiftTheme是目前iOS平台上最方便的换肤框架,而且功能丰富、高性能、可扩展,提供一个全新的换肤解决方案,使用纯Swift编写,但完全兼容OC。
截屏
缘起
项目需求,我们要为“节操精选”开发夜间模式功能。我们的需求不是简单的调整亮度或者alpha
,而是更换为一套更深色的UI。因此所谓夜间模式其实就是特定的更换主题(换肤)功能。
如何实现呢?判断某个全局变量,然后在初始化视图控件时设置不同的背景色或者加载不同的切图文件?但是在切换主题时,已经初始化好的视图控件呢?没
错,也许你也想到了通过通知让相应的视图控件修改背景色或切图。想到这里你应该也意识到了Controller中将充斥着注册通知、if...else
、更新视图控件的代码,糟糕的是如果忘记了注销通知还可能引起应用崩溃。
一番思考后,我们对该任务提出了更高的要求,打造一套简单、可复用的主题框架,正如你看到的这样。
目标
将SwiftTheme
打造为一款简单、功能丰富、高性能、可扩展的主题框架(换肤框架),为iOS 平台提供一个统一的主题解决方案。
示例
索引方式
让 UIView
随主题变换背景色?
view.theme_backgroundColor = ThemeColorPicker(colors: "#FFF", "#000")
让 UILabel
和 UIButton
随主题变换文字颜色?
label.theme_textColor = ThemeColorPicker(colors: "#000", "#FFF") button.theme_setTitleColor(ThemeColorPicker(colors: "#000", "#FFF"), forState: .Normal)
让 UIImageView
随主题变换切图?
imageView.theme_image = ThemeImagePicker(names: "day", "night")
没问题,当你执行如下代码时,奇迹发生了!
//这里的数字代表主题参数的索引 ThemeManager.setTheme(isNight ? 1 : 0)
直接根据索引切换主题,便于快速开发。适合主题不多、无需下载主题的App。
plist 方式
为了满足通过网络下载和安装主题包的需求,我们支持以plist
配置主题。简单讲就是在plist
中记录配置参数,比如背景色、切图文件名等,在代码中通过key
来指定相应的参数。因此,该plist
文件以及用到的资源文件就组成了一个主题包。
以下为用法示例:
view.theme_backgroundColor = ThemeColorPicker(keyPath: "Global.backgroundColor") imageView.theme_image = ThemeImagePicker(keyPath: "SelectedThemeCell.iconImage")
与索引方式类似,只是具体的参数值变为了间接的
key
名称,正因如此赋予了它扩展的能力。
切换主题时参数为plist
名称,这里以bundle
中的plist
文件及资源文件为例,使用沙箱中的文件也是可以的。
ThemeManager.setTheme("Red", path: .MainBundle)
plist
方式增加主题无需修改代码,可以无限扩展主题,因此你完全可以通过这种方式为你的用户开发下载安装主题的功能。
上面用到的plist
、image
展示如下:
自定义行为
如果你想在切换主题时执行自定义任务,或者当SwiftTheme
无法满足你的需求时,可以注册名为ThemeUpdateNotification
的通知,你可以在任何地方观察这个通知,来实现自定义的行为:
NSNotificationCenter.defaultCenter().addObserver(self, selector: "doSomething", name: ThemeUpdateNotification, object: nil)
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doSomething) name:@"ThemeUpdateNotification" object:nil];
Objective-C
完全兼容Objective-C,用法示例:
lbl.theme_backgroundColor = [ThemeColorPicker pickerWithColors:@[@"#FAF9F9", @"#E2E2E2"]];
主要特点
纯Swift编写
兼容Objective-C
基于
runtime
易于集成
扩展属性以
theme_*
开头,便于 IDE 自动补全支持
UIAppearance
自动监听主题切换,更新UI
支持通过字面量设置不同主题,通过索引进行切换
支持使用
plist
设置主题,可直接通过项目资源加载,或远程下载至沙盒中加载主题参数配置错误时日志提示
强类型
ThemePicker
完整的Demo
安装
Cocopods、Carthage和Framework安装基于动态链接库,动态链接库最低支持iOS8。
如果你的项目需要支持iOS7,必须手动拷贝源文件
Cocoapods
pod 'SwiftTheme' use_frameworks!
Carthage
github "jiecao-fm/SwiftTheme"
Framework
运行项目中名为SwiftTheme
的Target,将生成的framework
链到你自己的项目中
源文件(iOS7)
拷贝Source
文件夹下的所有文件到你的项目中
评论