CommonKit
一个带有一些常用扩展和函数的 Swift 框架
内容
各种扩展和函数。其中一些是我编写的,一些是从网络上收集的。还有一些是变体。这个框架通过结合一些有用且常用的代码,旨在帮助您更快地开始您的项目。包括一些扩展 UILabel 的 UI 类,因为对 UILabel 的扩展无法提供这些功能。
这个框架是某些我提供的其他框架的基础,而单独使用时,它本身并不提供太多。抱歉它变得如此庞大。最初我的框架更加分散;但由于我选择的框架名称大多数已经有人使用,我决定将我的大部分工作合并到这个单独的框架中。无论如何,最终,导入一个模块而不是十个模块要容易得多...
AppLocale
自 1.2.3 版本以来,LocaleKit 框架已被合并到 CommonKit 中。LocaleKit 允许在应用程序范围内定义固定的区域设置,同时也提供了一些对 Locale 的扩展功能,以及一些简单的数据格式化选项。
NumPad
自版本1.2.4起,我的NumPad框架与CommonKit合并。NumPad是一个数字键盘(具备一些样式选项,例如手机样式),适用于iPhone和iPad。还提供了带有“完成”按钮的完整辅助视图,适用于没有“确认”按钮的键盘。下面是一个示例。
MathKit
自版本1.2.6起,MathKit框架已与CommonKit合并。
DateKit
自版本1.2.7起,DateKit框架已与CommonKit合并。DateKit包含各种日期扩展以及UTC格式下处理日期和时间的一般辅助功能。
DispatchKit
自版本1.2.7起,DispatchKit框架已与CommonKit合并。DispatchKit包含对DispatchQueue的扩展以及简单的后台任务管理。示例代码已经包含。
CurrencyKit
自版本1.2.9起,CurrencyKit框架已与CommonKit合并。CurrencyKit是一个用于Swift的钱币展示框架。
AttributedStringWrapper
looperr编写的AttributedStringWrapper很棒。我不想将其作为依赖项,因此我已经将它与本项目合并。原始代码可在此处找到:https://github.com/loopeer/AttributedStringWrapper 自版本1.3.0起合并。
FontKit
自 1.3.0 版本起,FontKit 框架已与 CommonKit 合并。FontKit 提供了对图标字体的支持。初始支持包括
- FontAwesome5(3 种字体类型)
- MaterialIcons
- FoundationIcons
NumPad 类
NumPad 类为 iOS 平台提供了具有一些样式属性的 NumPad 风格键盘。类可以有以下类型之一
- number:简单的数字输入
- decimal:十进制数输入(添加小数点按钮)
- phone:电话号码输入(添加“+”按钮,并在横幅模式下更改按钮外观)
NumPad 样式
NumPad 可以使用以下属性进行样式设置
- overlayColor(视图背景)
- backgroundColor(按钮背景)
- backgroundColorHighlighted(按钮背景(高亮时))
- shadowColor(按钮阴影颜色)
- foregroundColor(按钮文本颜色)
- foregroundColorHighlighted(按钮文本颜色(高亮时))
- font(数字和“+/.”按钮的字体)
- phoneFont(电话类型时按钮字体)
- phoneCharFont(电话类型时用于字母的字体)
- backspaceColor(退格符号颜色)
DoneBar 类
DoneBar 是一个带有向右对齐的“完成”按钮的快速 UIToolbar 初化器。
NumPad 截图
使用方法
适用于UITextField或UITextView。
var tf: UITextField = UITextField(frame: .zero)
...
tf.inputView = NumPad(type: .number)
tf.inputAccessoryView = DoneBar()
步骤
- 下载此仓库
- 在自己的工作区中,将NumPad.xcodeproj添加到其中
- 在自己的项目(在工作区中),将NumPad添加到其框架中。
- 在需要NumPad的文件中添加import NumPad。
参见提供的示例。
货币
可用于
- 带有2位数字分币等的货币的钱计算。
- 使用区域设置显示货币价值。
- 包含基于textfield的UI元素,允许输入货币值。
- 还提供了一个包含价格信息的商品结构的结构。
- 数组形式的商品作为购物车。
- 为商品价格包含增值税计算。
它没有
- 支持切换货币/货币汇率(100美元=100欧元=100英镑,汇率不变)
- 支持Apple Pay或其他类似服务
如果需要更多?
查看Daniel Thorpe的Money: https://github.com/danthorpe/Money
截图(来自提供的示例)
图片中的键盘是什么?
这是由该框架提供的CurrencyPad。它可以在iPad和iPhone上同时运行。
键盘工作方式有点像计算器,我能否通过标准键盘获取光标并使其工作,或者使其体积极小一些?
当然可以,但那时您需要自行实现。目前我对它当前的实现感到满意。
用于存储金钱值的存储类型是什么?
我使用了 Decimal。并且 Money 结构体符合 Codable 协议。
能否对不同 Money 结构体求和?
是的。Money(10.0) + Money(20.0) = Money(30.0)
VAT 是否支持?
是的,在 Cart/CartItem 中。Money 总是金钱,所以它不在乎它的一部分是否用于税收或其他东西。有了 VAT,您可以获取 VAT 总额、VAT0 总额以及乘以项目数量的增值税总额。当然,还使用了 CartItem 的 VAT 百分比。
CartItem 除了价格还包含什么?
项目名称和数量。
是否精确?
我已经尽我所能提供精确的值。VAT 百分比支持 1 位小数,Money 支持 2 位小数。
我能否查看一些测试?
以下是示例应用程序的列表输出
Item1 | 15,00 € | 1 | 0% | 0,00 € | 15,00 € | 15,00 €
Item2 | 10,00 € | 1 | 24% | 2,40 € | 10,00 € | 12,40 €
Item3 | 15,00 € | 2pcs | 24% | 7,20 € | 30,00 € | 37,20 €
Item4 | 20,00 € | 0 | 0% | 0,00 € | 0,00 € | 0,00 €
Item5 | 9,00 € | 0 | 24% | 0,00 € | 0,00 € | 0,00 €
9,60 € | 55,00 € | 64,60 €
它的构建方式是这样的
var cart: Cart = Cart()
cart.append(CartItem(name: "Item1", price: 15.0))
cart.append(CartItem(name: "Item2", price: 10.0, VAT: 24.0))
cart.append(CartItem(name: "Item3", count: 2, unit: "pcs", price: 15.0, VAT: 24.0))
cart.append(CartItem(name: "Item4", count: 0, price: 20.0))
cart.append(CartItem(name: "Item5", count: 0, price: 9.0, VAT: 24.0))
FontKit
哇,第一个支持完整 FontAwesome v5 的框架出现了!
是真的... 但它与 v4 相比并没有好很多,v4 同样拥有大量的图标,所以如果您已经有一个使用 v4 的项目,升级到这个可能不会带来显著的变化,图标还是它们原来的样子,有时候更多并不总是更好。
还提供了什么?
- 一个可以用来生成更多字体支持的生成器
- 示例
通过这个可以假设你支持所有的 UI 元素吗?
抱歉,不是的 - 我只是创建了一个自定义 UILabel 子类。你可能想分叉这个并添加一些附加功能?当然很欢迎:)
可能存在一个字符串解析器,它用于解析FontAwesome风格的CSS引用到图标,并返回一个AttributedString吗?
是也不是 - 有一个解析器可以返回单个图标作为AttributedString,但您无法像这样使用它:"Text with fas-address-book picture." 这将工作: "fas-address-book"。再次,对于解决方案,也许您也可以通过分支此处来贡献?
我应该如何使用UITitleLabel
就像UILabel一样,但它有一些附加属性。查看源代码,这里是一个快速学习:UITitleLabel.title = 标签的文本部分(位于图标右侧)UITitleLabel.icon = 标签的图标部分(始终位于文本左侧)UITitleLabel.textOverflows = 一个布尔值,决定了标签内容如何显示。如果为false,文本应该始终缩进,从第一行的相同位置开始,如果有文本换行。如果为true,文本会在下一行溢出,从元素的leading坐标开始。
图标是一个兼容性类,这意味着可以有多种方式来填充它 - 提供的方式是直接指向字体->图标,以及字符串解析到字体->图标。如果这些方法不够,您还可以创建更多方法。
我应该如何将字体关联到图标?
icon = FontAwesome.brands.apple // Directly addressed
icon = "fab-apple" // String converted
Apple建议我将项目的Info.plist更改为包含字体列表,我应该立即这样做吗?
这取决于你。但如果你用这个工具(而不是直接通过 UIFont 初始化器指定字体)或者至少第一次这样访问它们,我提供了一种自动资源加载器来加载字体。如果你想直接使用,首先用下划线作为变量名初始化它们,然后它们就可以直接从 UIFont 初始化器中使用了——或者你也可以对你的 Info.plist 做适当的修改,别忘了这完全由你自己决定。
代码生成器生成了无法编译的代码!
是的——它并不完美。这只是一些启动帮助,一些图标名称可能因为 Swift 语法不允许从生成器来的名称而需要调整。我提供的枚举已经包含了必要的修改。
TableViewKit
从 1.3.2 版本开始包含。TableViewKit 对 UITableViewController、UITableViewCell 和 UITableViewDataSource 的头部做了一些改进。还增加了几个新的类:UITableViewControllerExtended 和 UITableViewCellExtended,它们提供了扩展的功能。另外还加入了一个 UITitleLabel 类,它是带有图标和标题的自定义单元格的基础。
PhotoPicker
PhotoPicker 已从 CommonKit 中移除。现在它已包含在 CommonKitPhotos 存储库中。CommonKitPhotos 位于 https://github.com/oskarirauta/CommonKit
位置支持
位置和图标配置已从 CommonKit 中移除。现在它包含在 CommonKitLocation 存储库中,也可以作为一个独立的框架使用,无需与 CommonKit 一起使用。CommonKitLocation 位于 https://github.com/oskarirauta/CommonKitLocation
ConditionalInit 协议
当您需要一个懒加载类(是的,是类,因为该类需要初始化),但又无法使用懒加载,因为您希望控制它并需要定期重置时,ConditionalInit 协议非常有用。还有其他方法可以实现这一点,例如执行懒加载的初始化器函数,但这里提供了一种不同的方法。在
var _realVar: UIViewController? = nil
var accessedVar: UIViewController? {
get {
if ( self._realVar == nil ) {
self._realVar = UIViewController()
}
return self._realVar
}
set { self._realVar = newValue }
}
之后
var _realVar: UIViewController? = nil
var accessedVar: UIViewController? {
get { return self._realVar.conditionalInit() }
set { self._realVar = newValue }
}
或者,您甚至可以为它创建一个创建函数
var _realVar: UIViewController? = nil
var accessedVar: UIViewController? {
get { return self._realVar.conditionalInit{ $0?.title = "Title text" } }
set { self._realVar = newValue }
}
它仅扩展到可选的 NSObject 类,因此您无法将其用于非可选类。如果使用很多这些数组,则可以节省一些编写时间。自 1.4.2 版本以来引入。
还有更多吗?
是的,很多。这个库实际上相当大,包含了大量内容。
示例
示例包含在 Podfiles 中,所以请转到 examples 根目录并执行 pod install
以启用编译。
许可证
包括的资源(字体等)可能受到不同许可证的影响。一些代码,尤其是 AttributedStringWrapper,并非由我创建。它是从 loopeer 的第三方框架提供的: https://github.com/loopeer/AttributedStringWrapper 代码的一些部分可以考虑为公共领域,因为想法甚至完整的实现可能来自 StackOverFlow 等论坛。
CocoaPods
CommonKit 现在通过 CocoaPods 提供使用。以下是一个示例 Podfile
source 'https://github.com/CocoaPods/Specs.git'
# inhibit_all_warnings!
use_frameworks!
platform :ios, '13.2'
swift_version = '5.0'
target 'YOURPROJECT' do
pod 'CommonKit', git: 'https://github.com/oskarirauta/CommonKit.git'
end