RxTheme
手动
定义主题服务
import RxTheme
protocol Theme {
var backgroundColor: UIColor { get }
var textColor: UIColor { get }
}
struct LightTheme: Theme {
let backgroundColor = .white
let textColor = .black
}
struct DarkTheme: Theme {
let backgroundColor = .black
let textColor = .white
}
enum ThemeType: ThemeProvider {
case light, dark
var associatedObject: Theme {
switch self {
case .light:
return LightTheme()
case .dark:
return DarkTheme()
}
}
}
let themeService = ThemeType.service(initial: .light)
将主题应用到 UI
// Bind stream to a single attribute
// In the way, RxTheme would automatically manage the lifecycle of the binded stream
view.theme.backgroundColor = themeService.attrStream { $0.backgroundColor }
// Or bind a bunch of attributes, add them to a disposeBag
themeService.rx
.bind({ $0.textColor }, to: label1.rx.textColor, label2.rx.textColor)
.bind({ $0.backgroundColor }, to: view.rx.backgroundColor)
.disposed(by: disposeBag)
所有由 ThemeService
生成的流都具有 share(1)
切换主题
themeService.switch(.dark)
// When this is triggered by some signal, you can use:
someSignal.bind(to: themeService.switcher)
其他APIs
// Current theme type
themeService.type
// Current theme attributes
themeService.attrs
// Theme type stream
themeService.typeStream
// Theme attributes stream
themeService.attrsStream
在您的代码库中扩展绑定的器
因为RxTheme使用RxCocoa的Binder
,所以RxCocoa中定义的任何Binder
都可以在这里使用。
这也使得在您的代码库中扩展lib变得非常简单,以下是一个示例
extension Reactive where Base: UIView {
var borderColor: Binder<UIColor?> {
return Binder(self.base) { view, color in
view.layer.borderColor = color?.cgColor
}
}
}
注意:自RxSwift 6以来,大多数基于变量的rx扩展应该已经通过@dynamicMemberLookup派生出来了。
如果您也想使用糖代码view.theme.borderColor
,您必须编写另一个扩展
extension ThemeProxy where Base: UIView {
var borderColor: Observable<UIColor?> {
get { return .empty() }
set {
let disposable = newValue
.take(until: base.rx.deallocating)
.observe(on: MainScheduler.instance)
.bind(to: base.rx.borderColor)
hold(disposable, for: "borderColor")
}
}
}
如果您认为您的扩展是常用的,请向我们发送PR。
示例
您可以运行示例项目,克隆仓库,首先从Example目录运行pod install
,然后打开工作区文件。
如果您更喜欢视频教程,请观看rebeloper的@rebeloper。
安装
5.x需要RxSwift 6,如果您正在使用RxSwift 5,请使用4.x。
SPM
- 文件 > Swift Packages > 添加包依赖项
- 添加https://github.com/RxSwiftCommunity/RxTheme
Cocoapods
pod 'RxTheme', '~> 5.0'
Carthage
github "RxSwiftCommunity/RxTheme" ~> 5.0.0
作者
duan, [email protected]
许可协议
RxTheme遵循MIT许可协议。更多信息请参见LICENSE文件。