描述
时尚 是您以 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 文件。