SwiftStylable
[](https://travis-ci.org/Marcel Bloemendaal/SwiftStylable)
用途
SwiftStylable 是一个框架,用于使用属性列表在 XCode 项目中定义样式。它包含一组具有 'styleName' 属性的 UIKit 组件子类。将属性设置为样式的名称将使组件在运行时以及 Interface Builder 中适应该样式。
功能
- 在属性列表中定义样式
- 属性列表中的命名颜色
- 支持的视觉属性广泛列表
- 样式继承
- 子样式属性允许对主样式进行变体
- 在Interface Builder中可见的样式!
- 通过简单地加载不同的样式描述符来在运行时更改样式
- 易于适应支持PaintCode图像(见下文)
安装
SwiftStylable 通过 CocoaPods 提供。要安装它,确保您在 Podfile 中有它,并在 Podfile 中添加以下内容
use_frameworks!
pod "SwiftStylable"
要求
- iOS 9 或更高版本
作者
Marcel Bloemendaal, [email protected]
许可协议
SwiftStylable 可在 MIT 许可协议下使用。更多信息请参阅 LICENSE 文件。
如何使用
样式描述符
为了定义您的样式,您需要在您的项目中创建一个名为'styles.plist'的文件。这个文件必须位于与您的XCode项目文件相邻的位置,以便SwiftStylable能够正常工作。文件应该具有以下结构
- 根目录
- 颜色(字典)
- 尺寸(字典)
- 样式(字典)
颜色
您可以在样式描述符文件的colors字典中以字符串的形式定义颜色。您可以自由选择名称,并设置十六进制字符串作为值,格式为'#XXXXXX'(完全不透明)或'#XXXXXXXX'(带有alpha数字)。例如,您可以定义一个名为'defaultForegroundColor'的颜色,其值为'#ffa8bb'。
尺寸
您可以在样式描述符文件的dimensions字典中以数字定义尺寸。您可以自由选择名称,并设置整数或小数值作为值。在底层它们将被解析为CGFloat。例如,您可以定义一个名为'defaultTextSize'的尺寸,其值为'15',或您可以定义一个名为'defaultTextLineHeightMultiple'的尺寸,其值为'0,5'。
样式
样式在被定义的样式描述符文件的styles字典中以字典的形式定义。您可以选择自己的样式名称。样式的子属性决定了风格化组件的视觉属性。所有属性都是可选的,并且只有在正确定义时才会设置。如果属性没有定义,则将使用组件的默认值。受支持的属性包括
- 父元素(字符串,另一个样式的名称)
- 前景色(字符串)
- 高亮前景色(字符串)
- 选中前景色(字符串)
- 禁用前景色(字符串)
- 背景颜色(字符串)
- 高亮背景颜色(字符串)
- 选中背景颜色(字符串)
- 禁用背景颜色(字符串)
- 边框颜色(字符串)
- 高亮边框颜色(字符串)
- 选中边框颜色名称(字符串)
- 禁用边框颜色(字符串)
- 边框宽度(数字)
- 边框样式(字符串:“none”,“line”,“bezel”或“roundedRect”)
- 圆角半径(数字)
- 裁剪到边界(布尔值)
- 使用前景色修饰图片(布尔值)
- 表格视图分隔线样式(字符串:“none”,“singleLine”,“singleLineEtched”)
- 表格视图分隔线颜色(字符串)
- 间距(数字或字符串,尺寸名称)
- 字体(字典)
- 名称(字符串,字体PostScript名称)
- 大小(数字或字符串,尺寸名称)
- 文字样式(字符串:“largeTitle”,“title1”,“title2”,“title3”,“headline”,“subheadline”,“body”,“callout”,“footnote”,“caption1”,“caption2”,“none”)
- 文字样式最大尺寸(数字或字符串,尺寸名称)
- 可访问性粗体名称(字符串)
- 全文大写(布尔值)
- 文字样式属性(字典--参阅下文“样式化文本”)
- 前景色(字符串)
- 字体(字典)
- 名称(字符串)
- 大小(数字或字符串,尺寸名称)
- 文字样式(字符串:“largeTitle”,“title1”,“title2”,“title3”,“headline”,“subheadline”,“body”,“callout”,“footnote”,“caption1”,“caption2”,“none”)
- 文字样式最大尺寸(数字或字符串,尺寸名称)
- 可访问性粗体名称(字符串)
- 行间距(数字或字符串,尺寸名称)
- 行高倍数(数字或字符串,尺寸名称)
- 字形间距(数字或字符串,尺寸名称)
- 下划线样式(字符串:“byWord”,“patternDash”,“patternDashDot”,“patternDashDotDot”,“patternDot”,“double”,“single”,“thick”或“none”)
- 下划线颜色(字符串)
- 删除线样式(字符串:“single”,“thick”,“double”或“none”)
- 删除线颜色(字符串)
- 对齐方式(字符串:“left”,“right”,“center”,“justified”或“natural”)
- 断行模式(字符串:“byTruncatingTail”,“byTruncatingMiddle”,“byTruncatingHead”,“byClipping”,“byCharWrapping”,“byWordWrapping”)
- 样式化占位符属性(字典,与“样式化文本属性”相同)
- 图片填充(数字或字符串,尺寸名称)(自iOS15起可用)
颜色
所有颜色属性应引用样式描述符的颜色部分的命名颜色。对于大多数颜色,除了正常颜色外,还有高亮、选中和禁用三种变体。大多数组件不使用这些变体。它们主要用于定义按钮状态。
tintImageWithForegroundColor 属性
该属性适用于图像和按钮。当此属性设置为 true 时,图像将使用前景色进行着色。在按钮中使用时,图像还将采用高亮、选中或禁用状态下设置的各种颜色。
按钮
在为按钮设置样式时,请记住,当你在Interface Builder中创建按钮时,必须将按钮的类型设置为'custom'。你还必须禁用'高亮调整图像'和'禁用调整图像',除非你希望这种行为。自iOS15以来,已可用UIButton.Configuration
。截至iOS15,SwiftStylable也使用了此配置。因此,如果你想要覆盖某些功能,请在按钮中使用配置。
字体
字体包含一个名称、一个大小、可选的文本样式和可选的最大文本样式大小。该名称是所需字体的PostScript名称。要支持自定义字体,字体将仍然需要按常规方式添加到项目中,并正确设置在项目下的info.plist文件中的'由应用程序提供的字体'中。除了指定postScriptName之外,你也可以使用预定义的字符串来使用系统字体。系统字体可用的字符串如下
- "systemFont"
- "boldSystemFont"
- "italicSystemFont"
- "thinSystemFont"
- "blackSystemFont"
- "heavySystemFont"
- "lightSystemFont"
- "mediumSystemFont"
- "semiboldSystemFont"
- "ultraLightSystemFont"
无障碍访问
如果你想使用无障碍设置功能,当前支持文本缩放和加粗文本选项。可以通过为字体提供一个textStyle
来开启文本缩放。如果设置了此属性,文本将被自动缩放。使用textStyleMaximumSize
属性设置一个最大字体大小。如果设置文本样式为"none"或保留textStyle
为空,则关闭文本缩放。要支持加粗文本的无障碍设置,应设置accessibilityBoldName
属性。这是要使用的(加粗)字体的PostScript名称。
样式化文本
STLabel和STTextView都支持'样式化文本'。这基本上是带有样式的文本,它使用样式中的指定属性设置。普通的Label/TextView有一个'text'属性和一个'attributedText'属性。对应的STComponents有一个额外的'styledText'属性(也存在于Interface Builder检查器中)。如果您使用此属性来设置组件的文本,所选样式的'styledTextAttributes'将自动应用。设置样式化文本将为您创建attributedText,然后它通过attributedText属性变得可用。样式化文本属性本身将包含您设置的字符串,直到您设置其他任何文本属性(text / attributedText),然后它将为nil。请参见本文件“样式”部分中的“styledTextAttributes”属性,以获取支持的文字属性列表。
样式继承
如果想要定义一个与先前定义的样式非常相似的样式,您可以将此先前的样式用作父样式。这样,您只需要在您创建的新样式中设置与父样式不同的属性。其他属性将简单地从父样式继承。要设置父样式,只需将'parent'属性添加到您的样式定义中,使用所需父样式的名称作为值。
子样式
每个样式组件都有一个styleName属性和一个substyleName属性。子样式可用于将一组覆盖应用到样式。假设您有大量的样式,但在应用程序的某些部分,您想应用一个覆盖某些样式前景色的主题。(可能还有其他属性)您可以创建具有父样式的新的样式并覆盖它们的前景色,但是您必须覆盖所有样式,针对所有可能的主题。您也可以为所有主题定义样式,其中您只覆盖前景色(以及需要更改为主题的其他属性)。然后,将主题样式作为子样式应用于应具有此主题的任何组件,这样您的主题外观就应用了。
在项目中使用样式
要在Interface Builder中的组件中使用你定义的样式,将组件的类更改为组件的SwiftStylable版本。(例如:要为UIButton设置样式,将其类更改为'STButton')请确保模块字段(在类字段下方)被设置为'SwiftStylable'。这通常可以自动完成。现在,组件应具有'styleName'和'substyleName'属性。要应用所需的样式到你的组件,现在只需将组件的'styleName'属性设置为样式的名称。你可能需要刷新你的Storyboard中的视图以使样式生效。(在Interface Builder中,选择“编辑”→“刷新所有视图”)
可样式化组件
以下组件目前可用
- STView
- STLabel
- STTextField
- STTextView
- STButton
- STImageView
- STActivityIndicator
- STSwitch
- STTableView
- STTableViewCell
- STHorizontalHairline
- STStackView
尺寸组件
以下组件目前可用
- STLayoutConstraint
PaintCode支持
如果您想在项目中使用PaintCode图像,可以轻松添加对它们的支持。要添加对按钮和图像中PaintCode图像的支持,将Example Project中的'PaintCodeHelper.swift'、'PCImage.swift'和'PCImage.swift'文件添加到您的项目中。然后更改PaintCodeHelper类中的_commands siglo attributeName)>UIImage函数以返回具有适当名称的您自己的StyleKit中的图像。这应该是相当直接的。
当您想在项目中使用StyleKit中的图像时,请确保使用PCImage或PCButton作为图像/按钮组件的自定义类,而不是普通的STImage或STButton。在这些组件中,您可以设置imageName。
示例
示例项目可在以下位置找到:[SwiftStylableExample](https://github.com/weareyipyip/SwiftStylableExample)
故障排除
当一个组件看起来不是你所期望的那样时,检查以下事项是否正常
- 该组件在接口构建器中是否设置了适当的“ST...”自定义类?
- 组件的自定义类的模块是否设置为SwiftStylable?(注意:当使用来自你自己的项目的PCImage或Button,或者你自己的项目中的ST[Component]子类时,模块应设置为你的应用模块。)
- styles.plist文件是否位于正确的位置?它应该与XCode项目文件位于同一位置,以便SwiftStylable能够找到它。(你可以在XCode中的任何组中引用它,只要实际文件位于此位置即可。)
- 你是否检查了你的样式的名称及其任何属性的拼写和大小写?它是否也在组件的“styleName”属性中拼写正确?
- 样式中的所有属性的值类型是否都已设置为正确类型?一个常见的错误是将字体的大小属性设置为字符串,而它应该是数字。当它是一个字符串时将不起作用。