Show labels on issue details
This commit is contained in:
@@ -287,3 +287,74 @@ func configureIssueStateIcon(
|
||||
icon.isAccessibilityElement = true
|
||||
icon.accessibilityLabel = accessibilityLabel
|
||||
}
|
||||
|
||||
func issueLabelView(_ label: LabelRow) -> UILabel {
|
||||
let view = UILabel()
|
||||
view.text = " \(label.name) "
|
||||
view.font = .preferredFont(forTextStyle: .caption2)
|
||||
view.adjustsFontForContentSizeCategory = true
|
||||
view.textColor = label.light ? .black : .white
|
||||
view.backgroundColor = UIColor(hex: label.color)
|
||||
view.layer.cornerRadius = 9
|
||||
view.clipsToBounds = true
|
||||
view.accessibilityLabel = "Label \(label.name)"
|
||||
return view
|
||||
}
|
||||
|
||||
final class IssueLabelsView: UIView {
|
||||
private let labels: [UILabel]
|
||||
private var contentHeight: CGFloat
|
||||
private let spacing: CGFloat = 6
|
||||
|
||||
init(_ rows: [LabelRow]) {
|
||||
labels = rows.map(issueLabelView)
|
||||
contentHeight = labels.first?.intrinsicContentSize.height ?? 0
|
||||
super.init(frame: .zero)
|
||||
labels.forEach(addSubview)
|
||||
NotificationCenter.default.addObserver(
|
||||
self,
|
||||
selector: #selector(contentSizeCategoryDidChange),
|
||||
name: UIContentSizeCategory.didChangeNotification,
|
||||
object: nil
|
||||
)
|
||||
}
|
||||
|
||||
@available(*, unavailable)
|
||||
required init?(coder: NSCoder) { fatalError("init(coder:) is not supported") }
|
||||
|
||||
override var intrinsicContentSize: CGSize {
|
||||
CGSize(width: UIView.noIntrinsicMetric, height: contentHeight)
|
||||
}
|
||||
|
||||
override func layoutSubviews() {
|
||||
super.layoutSubviews()
|
||||
guard bounds.width > 0 else { return }
|
||||
var origin = CGPoint.zero
|
||||
var rowHeight: CGFloat = 0
|
||||
for label in labels {
|
||||
let size = label.sizeThatFits(
|
||||
CGSize(width: bounds.width, height: .greatestFiniteMagnitude)
|
||||
)
|
||||
if origin.x > 0, origin.x + size.width > bounds.width {
|
||||
origin.x = 0
|
||||
origin.y += rowHeight + spacing
|
||||
rowHeight = 0
|
||||
}
|
||||
label.frame = CGRect(origin: origin, size: size)
|
||||
origin.x += size.width + spacing
|
||||
rowHeight = max(rowHeight, size.height)
|
||||
}
|
||||
let height = origin.y + rowHeight
|
||||
if contentHeight != height {
|
||||
contentHeight = height
|
||||
invalidateIntrinsicContentSize()
|
||||
}
|
||||
}
|
||||
|
||||
@objc private func contentSizeCategoryDidChange() {
|
||||
labels.forEach { $0.font = .preferredFont(forTextStyle: .caption2) }
|
||||
contentHeight = labels.first?.intrinsicContentSize.height ?? 0
|
||||
invalidateIntrinsicContentSize()
|
||||
setNeedsLayout()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user