RxTheme 6.0.0

RxTheme 6.0.0

CarlRxSwift Community 维护。



 
依赖项
RxSwift~> 6.0
RxCocoa~> 6.0
 

RxTheme 6.0.0

RxTheme

Build Status Version Carthage compatible License Platform

手动

定义主题服务

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

  1. 文件 > Swift Packages > 添加包依赖项
  2. 添加https://github.com/RxSwiftCommunity/RxTheme

Cocoapods

pod 'RxTheme', '~> 5.0'

Carthage

github "RxSwiftCommunity/RxTheme" ~> 5.0.0

作者

duan, [email protected]

许可协议

RxTheme遵循MIT许可协议。更多信息请参见LICENSE文件。