样式文本 
样式文本是一个库,它简化了在iOS应用程序中设置动态文本样式。您不需要在每次需要更新文本时都使用富文本字符串,您可以在标签上声明性地设置一个文本样式。当标签的文本更新时,标签会使用预设的样式。
之前
let label = UILabel()
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 4.0
let attributes: [String: Any] = [NSFontAttributeName: UIFont.boldSystemFont(ofSize: 14),
NSForegroundColorAttributeName: UIColor.blue,
NSKernAttributeName: 1.5,
NSParagraphStyleAttributeName: paragraphStyle]
let string = NSAttributedString(string: "This is a string",
attributes: attributes)
label.attributedText = string
let newString = NSAttributedString(string: "This is a new string",
attributes: attributes)
label.attributedText = newString
之后
let styledLabel = StyledLabel()
styledLabel.textStyle = TextStyle(font: .boldSystemFont(ofSize: 14), color: .blue, lineSpacing: 4.0, kern: 1.5)
styledLabel.text = "This is a string"
styledLabel.text = "This is a new string"
安装
- 将此行添加到您的Podfile中
pod "StyledText"
- 运行
pod install
- 一切准备就绪!
如何使用
使用StyledText很容易,只需将一个StyledLabel
添加到您的视图中,并提供一个TextStyle
。之后,它就像任何其他的UILabel
一样表现。对标签的text
属性的更改将始终使用设置的textStyle
。
class ViewController: UIViewController {
private let styledLabel: StyledLabel = {
let label = StyledLabel(frame: .zero)
label.textStyle = TextStyle(font: .boldSystemFont(ofSize: 24.0),
color: .orange)
return label
}()
}
TextStyle
TextStyle
表示样式化视图绘制文本时应使用的属性。支持许多不同的文本格式化选项,包括之前需要与属性字符串或段落样式交互的选项,例如字距和行距。创建一个TextStyle
很容易,只需指定一个字体,以及您想要定义的任何其他属性。未指定的属性将保持为系统默认值。
let style = TextStyle(font: .italicSystemFont(ofSize: 72),
color: .magenta,
lineSpacing: 10,
lineHeightMultiple: 2.0,
kern: -0.5,
alignment: .left,
lineBreakMode: .byTruncatingMiddle)
let blueStyle = style.with(color: .blue)
let redStyle = style.with(color: .red)
提供默认值
您可能有适用于字体合理的默认值,这对于您的字体来说效果很好。无需在您创建的每个单独的TextStyle
中指定此字距值,您可以使用TextStyleDefaultsGenerator
来自动添加它。开始使用此方法的最简单方法是扩展TextStyle
以符合TextStyleDefaultsGenerator
协议,库将检测您是否已添加此协议,并以适当的方式表现。
extension TextStyle: TextStyleDefaultsGenerator {
private static let defaultCeraKern: CGFloat = -0.2
private static let defaultChronicleKern: CGFloat = -0.2
static public func defaultKern(for font: UIFont) -> CGFloat? {
if font.fontName.contains("Cera") {
return defaultCeraKern
} else if font.fontName.contains("Chronicle") {
return defaultChronicleKern
}
return nil
}
}
动态字体支持
StyledText 支持将文本内容缩放至系统字体大小,这是苹果公司称为 动态字体 的功能。要使用此功能,请将 TextStyle
的 dynamicTypeBehavior
属性设置为以下值之一
noScaling
: [默认] 保持字体大小不变,即使系统字体大小更改scaleToStandardSizes
: 将字体缩放到所有标准系统字体大小,更大的可访问性大小被限制在最大标准大小scaleToAllSizes
: 将字体缩放到所有标准和可访问性字体大小
在您的应用程序运行期间,字体大小可能会更改。当发生这种情况时,您需要调用可见的任何样式化组件上的 refreshStyle()
以更新大小。一种不错的方式来监听此事件是向共享的 DynamicTypeController
添加一个代理
class MyViewController: UIViewController, DynamicTypeControllerDelegate {
let label: StyledLabel = {
let label = StyledLabel()
label.textStyle = TextStyle(font: .boldSystemFont(ofSize: 14), color: .black, dynamicTypeBehavior: .scaleToStandardSizes)
return label
}()
override func viewDidLoad() {
super.viewDidLoad()
DynamicTypeController.shared.addDelegate(self)
}
func preferredContentSizeCategoryDidUpdate(controller: DynamicTypeController, newCategory: UIContentSizeCategory){
label.refreshStyle()
}
}
样式化组件
为了启用自动样式,StyledText 使用多个视图子类,这些子类是传统 UIKit 组件的简单替换
StyledText 视图 | 替换 UIKit 视图 |
---|---|
StyledLabel | UILabel |
StyledTextView | UITextView |
StyledButton* | UIButton |
[*] 使用 StyledButton
StyledButton
为每个 UIControlState
按钮状态提供文本样式属性
控件状态 | 文本样式属性 |
---|---|
.normal | normalTextStyle |
.highlighted | highlightedTextStyle |
.disabled | disabledTextStyle |
.selected | selectedTextStyle |
许可
StyledText 可在 MIT 许可证下获得。有关更多信息,请参阅 LICENSE 文件。