SwiftTheme 正在参加 2021 年度 OSC 中国开源项目评选,请投票支持!
SwiftTheme 在 2021 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
2021 年度 OSC 中国开源项目评选 正在火热进行中,快来投票支持你喜欢的开源项目!
2021 年度 OSC 中国开源项目评选 >>> 中场回顾
SwiftTheme 获得 2021 年度 OSC 中国开源项目评选「最佳人气项目」 !
授权协议 MIT
开发语言 Swift
操作系统 iOS
软件类型 开源软件
所属分类 iOS代码库
开源组织
地区 国产
投 递 者 阿森
适用人群 未知
收录时间 2016-04-13

软件简介

SwiftTheme是目前iOS平台上最方便的换肤框架,而且功能丰富、高性能、可扩展,提供一个全新的换肤解决方案,使用纯Swift编写,但完全兼容OC。

截屏

缘起

项目需求,我们要为“节操精选”开发夜间模式功能。我们的需求不是简单的调整亮度或者alpha,而是更换为一套更深色的UI。因此所谓夜间模式其实就是特定的更换主题(换肤)功能。

如何实现呢?判断某个全局变量,然后在初始化视图控件时设置不同的背景色或者加载不同的切图文件?但是在切换主题时,已经初始化好的视图控件呢?没 错,也许你也想到了通过通知让相应的视图控件修改背景色或切图。想到这里你应该也意识到了Controller中将充斥着注册通知、if...else、更新视图控件的代码,糟糕的是如果忘记了注销通知还可能引起应用崩溃。

一番思考后,我们对该任务提出了更高的要求,打造一套简单、可复用的主题框架,正如你看到的这样。

目标

SwiftTheme打造为一款简单、功能丰富、高性能、可扩展的主题框架(换肤框架),为iOS 平台提供一个统一的主题解决方案。

示例

索引方式

UIView 随主题变换背景色?

view.theme_backgroundColor = ThemeColorPicker(colors: "#FFF", "#000")

UILabelUIButton 随主题变换文字颜色?

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方式增加主题无需修改代码,可以无限扩展主题,因此你完全可以通过这种方式为你的用户开发下载安装主题的功能。

上面用到的plistimage展示如下:

自定义行为

如果你想在切换主题时执行自定义任务,或者当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文件夹下的所有文件到你的项目中

展开阅读全文

代码

评论

点击加入讨论🔥(1) 发布并加入讨论🔥
暂无内容
发表了博客
{{o.pubDate | formatDate}}

{{formatAllHtml(o.title)}}

{{parseInt(o.replyCount) | bigNumberTransform}}
{{parseInt(o.viewCount) | bigNumberTransform}}
没有更多内容
暂无内容
发表了问答
{{o.pubDate | formatDate}}

{{formatAllHtml(o.title)}}

{{parseInt(o.replyCount) | bigNumberTransform}}
{{parseInt(o.viewCount) | bigNumberTransform}}
没有更多内容
暂无内容
暂无内容
1 评论
11 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部