Giotto
示例
要运行示例项目,先将存储库克隆,然后从 Example 目录运行 pod install
需求
安装
Giotto 可以通过 CocoaPods 获取。要安装它,只需将以下行添加到您的 Podfile 即可
pod "Giotto"
许可证
Giotto采用Apache许可证。有关更多信息,请参阅LICENSE文件。
简介
SDThemeManager(以下简称TM)主要旨在简化并标准化需要自定义GUI的应用程序开发。
属性文件.plist
描述主题的plist必须包含包含所有常量的Constants字典,而样式可以按需排列在其他字典中。
常量
包含所有常量,如字体名称、颜色或大小。技术上,这是一个组织为一层字典的字典,如下所示:<constant_name> : <constant_value>
按照惯例,键具有以下前缀
- 字体名称:键以
FONT_
开头- 颜色代码:键以
COLOR_
开头- 尺寸(整数或浮点数):键以
DIMENSION_
开头
示例
{
“FONT_REGULAR” : “Helvetica-Neue”,
“COLOR_COMMON_BACKGROUND” : “color:000000FF”,
“DIMENSION_VIEW_WIDTH” : 3 // value is a NSNumber
}
有关color:
惯例的说明,请参阅惯例部分 常量不能包含数组或字典作为值。
样式组
与常量相同级别,还可以定义其他字典作为图形样式函数组。组名称是自由的。技术上,它们按照以下所示组织为字典:<style_name> : <style_dictionary>
样式字典的组织方式如下:<property_name> : <value_to_apply>
示例
{
“CommonLabel” :
{
“_superstyle”: <style name of parent>,
“textColor” : “COLOR_COMMON_LABEL”,
“font”: “font:FONT_REGULAR,18”
},
“HomeViewController” :
{
“titleLabel” : “style:CommonLabel”,
“textField” :
{
“textColor” : “color:FFFFFF”,
“width” : “DIMENSION_FIELD_WIDTH”,
“layer.borderWidth” : 2
}
}
}
关于_superstyle
、style:
和font:
的说明,请参阅惯例部分
约定
为了加快主题的起草速度,并允许处理特定但频繁出现的情况,已定义以下约定:
键的约定
_superstyle
:可以在样式的字典中输入,以指示该样式从另一个样式继承。当“父”样式在“子”样式之前应用时,您可以覆盖“子”中的keyPaths。可以通过连续用逗号分割它们来继承多个样式。指示的样式将按顺序应用,因此在列表中先于它出现的样式中具有相同keyPaths的样式值被覆盖后,将应用显示的样式。
值的约定
style:style_name1,style_name2
:在键中指示的属性将使用列表中列出的样式进行样式化。必须在一个样式组中存在显示的样式。简写版本s: style_name1,style_name2
。与_superstyle
一样,显示的样式将按顺序应用。font:font_name, font_size
:将UIFont实例化为指定的属性值。此约定还可在常量中使用。简写版本f: font_name, font_size
。
font_name
可以采用常规值来加载系统字体
系统
`systemBold`
`systemItalic`
color:color_string
:将color_string渲染为UIColor以验证键中指定的属性。此约定还可在常量中使用。简写版本c: color_string
。null
或nil
:将键中指示的属性设置为nil
。point:x,y
:将属性设置为具有x和y值的CGPoint。x和y值解释为浮点数。size:width,height
:将属性设置为具有指定的宽度和高度的CGSize。值解释为浮点数。rect:x,y,width,height
:将属性设置为具有x、y、宽度和高度的CGRect。值解释为浮点数。edge:top,left,bottom,right
:将属性设置为具有上、左、下和右值的UIEdgeInsets。值解释为浮点数。
样式的键
如前所述,样式看起来像某个样式组中的一个字典,可以应用于任何 NSObject(通常是界面元素)。字典键可以是
- 约定给出的键之一(见专用段落)
- 被样式化的对象的属性
- 被样式化的对象中的一个属性的关键路径(例如,“layer.borderColor”)
- 一个不表示真实属性但将在对象从 NSObject+ThemeManager 类别继承的适当方法中处理的字符串。
- 用 "," 分隔的属性或关键路径列表。
指定的属性也可能是一个 NSArray(例如 IBOutletCollection)。在这种情况下,值应用于数组中的所有对象。
样式的应用
要将 Plist 中声明的样式应用于对象,只需使用以下代码行
[[SDThemeManager sharedManager] applyStyleWithName:@"NomeStile" toObject:object];
指定的对象也可以是 self。
特殊属性管理
库中包含一个类别 NSObject+ThemeManager,它公开了以下方法
- (void) applyThemeValue:(id)value forKeyPath:(NSString*)keyPath;
该方法被某些子类类别覆盖,以特殊方式处理一些属性。这些类别始终包含在 Sysdata 库中。例如,UITextField+ThemeManager 管理了属性 placeholderColor 以使用 attributedPlaceholder。
NSObject+ThemeManager 类别声明协议
@protocol ThemeManagerCustomizationProtocol <NSObject>
@optional
- (BOOL) shouldApplyThemeCustomizationForKeyPath:(NSString*)keyPath;
- (void) applyCustomizationOfThemeValue:(id)value forKeyPath:(NSString*)keyPath;
@end
此协议的方法可以实现在库本身之外的自定义属性管理。这些是唯一必须在外部库中使用的实现方法,以避免危险地实现先前所述的方法。
方法 shouldApplyThemeCustomizationForKeyPath:
只应返回 YES
对于您打算手动处理的关键路径。
方法 applyCustomizationOfThemeValue:forKeyPath:
必须包含上一步方法接受的键路径的定制实现。
其他主题
ThemeManager 必须需要一个 默认 主题,并且可以通过方法指定一或多个替代样式。
- (void) setAlternativeThemes:(NSArray*)alternativeThemes
- 数组中必须包含替代主题的 plist 文件名。当你尝试应用一种样式时,ThemeManager 会首先在第一个替代主题中查找。如果在第二个或其他主题中没有找到,则 ThemeManager 会寻找默认主题中的它。
顺序很重要!!
向下兼容性
ThemeManager 的第 2 版是可以向后兼容的。为了处理与新旧 Plist 格式的反向兼容性,新的格式必须包含键值对:“formatVersion” : 2。
动态行为
以下方法可以以编程方式更改主题和常量值。
以编程方式更改常量的值。
- (void) modifyConstant:(NSString*)constant withValue:(id)value
以编程方式修改给定路径上的样式的值。
- (void) modifyStlye:(NSString*)style forKeyPath:(NSString*)keyPath withValue:(id)value
注意!!:
- 更改只在应用程序会话期间生效。如果你想在重启应用程序后看到更改,请使用 synchronizeModifies 方法持久化更改。
- 默认情况下,整个样式会被替换成新的值和过去的键路径。如果你只想修改特定的值并保持基本主题中设置的所有其他键路径值,请使用方法 modifyStyle:inheritanceEnable: 启用样式的继承。
默认情况下,修改一个样式设置某些键路径会替换包含在新键路径中的捆绑包中的整个样式。如果你想保持基本主题中设置的所有其他键路径值,请启用继承。
- (void) modifyStyle:(NSString*)style inheritanceEnable:(BOOL)inheritanceEnable
为了将所有通过编程方式设置的更改持久化,以便在应用程序下一次启动时检索它们。否则,所有更改都将在当前会话期间可用。
- (void) synchronizeModifies
通过编程方式重置设置的所有更改(使用 modifyConstant:withValue: 或 modifyStyle:forKeyPath:withValue:)。
- (void) resetModifies