Skip to content

Commit af5b636

Browse files
committed
完善Label的baselineAdjustment属性 对齐处理
1 parent c55fd9b commit af5b636

File tree

2 files changed

+35
-8
lines changed

2 files changed

+35
-8
lines changed

Sources/Extension/UIKit/UILabel/UILabelExtension.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ fileprivate extension UILabel {
271271

272272
// 构建同步Label的TextKit
273273
// 注: 目前还剩一个截断处理没解决 比如 "a\n\n\nb" numberOfLines=2
274-
let delegate = UILabelLayoutManagerDelegate(scaledMetrics)
274+
let delegate = UILabelLayoutManagerDelegate(scaledMetrics, with: baselineAdjustment)
275275
let textStorage = NSTextStorage()
276276
let textContainer = NSTextContainer(size: bounds.size)
277277
let layoutManager = NSLayoutManager()

Sources/Extension/UIKit/UILabel/UILabelLayoutManagerDelegate.swift

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@ class UILabelLayoutManagerDelegate: NSObject, NSLayoutManagerDelegate {
1919

2020
// 当Label发生Scaled时
2121
let scaledMetrics: UILabel.ScaledMetrics?
22+
let baselineAdjustment: UIBaselineAdjustment
2223

23-
init(_ scaledMetrics: UILabel.ScaledMetrics?) {
24+
init(_ scaledMetrics: UILabel.ScaledMetrics?, with baselineAdjustment: UIBaselineAdjustment) {
2425
self.scaledMetrics = scaledMetrics
26+
self.baselineAdjustment = baselineAdjustment
2527
super.init()
2628
}
2729

@@ -70,12 +72,37 @@ class UILabelLayoutManagerDelegate: NSObject, NSLayoutManagerDelegate {
7072

7173
// 当Label发生Scaled时 最大行数为1时 基线偏移不会按比例计算
7274
if let scaledMetrics = scaledMetrics, textContainer.maximumNumberOfLines == 1 {
73-
// 使用原始基线偏移 使用Scaled的尺寸高度
74-
var baseline = baselineOffset.pointee
75-
baseline = CGFloat(scaledMetrics.baselineOffset)
76-
baselineOffset.pointee = baseline
77-
rect.size.height = scaledMetrics.scaledSize.height
78-
used.size.height = scaledMetrics.scaledSize.height
75+
switch baselineAdjustment {
76+
case .alignBaselines:
77+
// 原始的基线偏移 使用Scaled的尺寸高度
78+
var baseline = baselineOffset.pointee
79+
baseline = .init(scaledMetrics.baselineOffset)
80+
baselineOffset.pointee = baseline
81+
rect.size.height = scaledMetrics.scaledSize.height
82+
used.size.height = scaledMetrics.scaledSize.height
83+
84+
case .alignCenters:
85+
print(scaledMetrics)
86+
// 居中的基线偏移 使用Scaled的尺寸高度
87+
var baseline = baselineOffset.pointee
88+
// 整行的占用高度 - 缩放的行高 = 上下边距; 上边距 = 上下边距 * 0.5; 居中的基线偏移 = 上边距 + 缩放的基线偏移
89+
let margin = (scaledMetrics.scaledSize.height - .init(scaledMetrics.scaledLineHeight)) * 0.5
90+
baseline = margin + .init(scaledMetrics.scaledBaselineOffset)
91+
baselineOffset.pointee = baseline
92+
rect.size.height = scaledMetrics.scaledSize.height
93+
used.size.height = scaledMetrics.scaledSize.height
94+
95+
case .none:
96+
// 缩放的基线偏移 使用Scaled的尺寸高度
97+
var baseline = baselineOffset.pointee
98+
baseline = .init(scaledMetrics.scaledBaselineOffset)
99+
baselineOffset.pointee = baseline
100+
rect.size.height = scaledMetrics.scaledSize.height
101+
used.size.height = scaledMetrics.scaledSize.height
102+
103+
default:
104+
break
105+
}
79106
}
80107

81108
// 重新赋值最终结果

0 commit comments

Comments
 (0)