时尚 4.2.0

时尚 4.2.0

测试已测试
语言语言 SwiftSwift
许可 NOASSERTION
发布上次发布2020 年 12 月
SPM支持 SPM

Vadym Markov 维护。



时尚 4.2.0

Fashion

CI Status Version Carthage Compatible Swift License Platform

描述

时尚 是您以 Swifty 方式共享和重用 UI 样式的助手。主要目标不是使用 CSS 设计原生应用,而是使用一系列便捷的助手函数将样式与布局代码解耦,提高定制性和可重用性。同时,我们试图超越 UIAppearance 的可能性,以对特定类型的所有实例对象进行外观定制。

目录

使用

传统方式

在样式表中定义样式

enum Style: String, StringConvertible {
  case customButton

  var string: String {
    return rawValue
  }
}

final class MainStylesheet: Stylesheet {
  func define() {
    share { (label: UILabel) in
      label.textColor = .blue
      label.numberOfLines = 2
      label.adjustsFontSizeToFitWidth = true
    }

    // register("custom-button") { (button: UIButton) in
    register(Style.customButton) { (button: UIButton) in
      button.backgroundColor = .red
      button.setTitleColor(.white, for: .normal)
    }
  }
}

注册样式表

Fashion.register([MainStylesheet()])

应用样式

let button = UIButton() // let button = UIButton(styles: "custom-button")
button.apply(styles: Style.customButton) // backgroundColor => .red

let label = UILabel()
addSubview(label) // textColor => .blue

样式表

样式表 是一个协议,它通过在 define 方法中注册样式来帮助您组织样式

注册一个样式

// Registers stylization closure with the specified name.
register("card-view") { (view: UIView) in
  view.backgroundColor = .white
  view.layer.masksToBounds = false
  view.layer.shadowColor = UIColor.black.cgColor
  view.layer.shadowOffset = CGSize(width: 0, height: 0.5)
  view.layer.shadowOpacity = 0.2
  view.layer.cornerRadius = 8
}

注销一个样式

// Unregisters stylization closure with the specified name.
unregister("card-view")

共享一个样式

此类型的所有对象都将考虑继承因素来共享样式。

// All views will have red background color.
share { (view: UIView) in
  view.backgroundColor = .red
}

// All table views will have white background color, it overrides the red
// background registered above.
share { (tableView: UITableView) in
  tableView.backgroundColor = .white
  tableView.tableFooterView = UIView(frame: CGRect.zero)
  tableView.separatorStyle = .none
  tableView.separatorInset = .zero
}

取消共享样式

// Unregisters shared stylization closure for the specified type.
unshare(UITableView.self)

UIAppearance

share 是推荐用于自定义类实例外观的方法,但有时我们仍然必须使用 UIAppearance,因为当视图进入窗口时,类的外观代理默认设置了样式。

shareAppearance { (barButtonItem: UIBarButtonItem) in
  barButtonItem.setTitleTextAttributes([
    NSFontAttributeName : UIFont(name: "HelveticaNeue-Light", size: 12)!,
    NSForegroundColorAttributeName : UIColor.red],
    for: .normal)
}

样式表

当您在 样式表 中注册/共享样式时,所有的实际工作都是由隐藏中的 Stylist 完成的,因此如果您想获得更多的自由,就可以直接使用 Stylist 类。您可以创建一个新实例 Stylist() 或使用全局变量 Stylist.master,它在样式表中使用。

let stylist = Stylist()

stylist.register("card-view") { (view: UIView) in
  view.backgroundColor = .white
  view.layer.cornerRadius = 8
}

stylist.unregister("card-view")

stylist.share { (tableView: UITableView) in
  tableView.backgroundColor = .white
  tableView.tableFooterView = UIView(frame: .zero)
}

stylist.unshare(UITableView.self)

样式

如果您想对应用中的样式应用、位置和方式进行更多控制,请使用通用的 Style 结构。然后您不需要处理样式键、注册或共享闭包。

let label = UILabel()
let style = Style<UILabel> { label in
  label.backgroundColor = UIColor.black
  label.textColor = UIColor.white
  label.numberOfLines = 10
}

// The same as style.apply(to: label)
label.apply(style: style)

您还可以通过组合多个样式来创建样式。

let label = UILabel()
let style1 = Style<UILabel> { label in
  label.backgroundColor = UIColor.black
}
let style2 = Style<UILabel>{ label in
  label.textColor = UIColor.white
}

let composedStyle = Style.compose(style1, style2)

// The same as composedStyle.apply(to: label)
label.apply(style: composedStyle)

UIView 扩展

使用 UIView 扩展可以轻松应用先前注册的样式。

使用便利构造函数

// A single style
let button = UIButton(styles: "custom-button")

// Multiple styles should be separated by a space
let label = UILabel(styles: "content-view cool-label")
// The initialized also accepts StringConvertible, so something other
// than magic String could also be used

enum Style: String, StringConvertible {
  case customButton
  case contentView
  case coolLabel

  var string: String {
    return rawValue
  }
}

// A single style
let button = UIButton(styles: Style.customButton)

// Multiple styles
let label = UILabel(styles: [Style.contentView, Style.coolLabel])

使用 apply 函数

let label = UILabel()

// StringConvertible
label.apply(styles: Style.contentView, Style.coolLabel)

// String
label.apply(styles: "content-view", "cool-label")

// Style structs
let style = Style<UILabel> { label in
  label.backgroundColor = UIColor.black
}
label.apply(style: style)

使用 @IBInspectable 属性 styles

let button = UIButton()

// A single style
button.styles = "custom-button"

// Multiple styles
button.styles = "content-view custom-button"

作者

Vadym Markov, [email protected]

安装

时尚可以通过 CocoaPods 使用。要安装它,只需将以下行添加到您的Podfile中

pod 'Fashion'

时尚也可以通过 Carthage 使用。要安装,只需将以下内容写入您的Cartfile

github "vadymmarkov/Fashion"

作者

Vadym Markov, [email protected]

贡献

我们非常希望您为 时尚 做出贡献,请查看 CONTRIBUTING 文件以获取更多信息。

许可

时尚可在MIT许可下使用。更多信息请参阅 LICENSE 文件。