TM-SGNL-iOS/Signal/ConversationView/CellViews/CVStackView.swift
TeleMessage developers dde0620daf initial commit
2025-05-03 12:28:28 -07:00

100 lines
2.6 KiB
Swift

//
// Copyright 2020 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import SignalServiceKit
public import SignalUI
public typealias CVStackViewConfig = OWSStackView.Config
// MARK: -
public extension UIStackView {
static func measure(config: CVStackViewConfig,
subviewSizes: [CGSize],
verboseLogging: Bool = false) -> CGSize {
let spacingCount = max(0, subviewSizes.count - 1)
var size = CGSize.zero
switch config.axis {
case .horizontal:
size.width = subviewSizes.map { $0.width }.reduce(0, +)
size.height = subviewSizes.map { $0.height }.reduce(0, max)
if verboseLogging {
Logger.verbose("size of subviews: \(size)")
}
size.width += CGFloat(spacingCount) * config.spacing
if verboseLogging {
Logger.verbose("size of subviews and spacing: \(size)")
}
case .vertical:
size.width = subviewSizes.map { $0.width }.reduce(0, max)
size.height = subviewSizes.map { $0.height }.reduce(0, +)
if verboseLogging {
Logger.verbose("size of subviews: \(size)")
}
size.height += CGFloat(spacingCount) * config.spacing
if verboseLogging {
Logger.verbose("size of subviews and spacing: \(size)")
}
@unknown default:
owsFailDebug("Unknown axis: \(config.axis)")
}
size.width += config.layoutMargins.left + config.layoutMargins.right
size.height += config.layoutMargins.top + config.layoutMargins.bottom
if verboseLogging {
Logger.verbose("size of subviews and spacing and layoutMargins: \(size)")
}
return size
}
func apply(config: CVStackViewConfig) {
if self.axis != config.axis {
self.axis = config.axis
}
if self.alignment != config.alignment {
self.alignment = config.alignment
}
if self.spacing != config.spacing {
self.spacing = config.spacing
}
if self.layoutMargins != config.layoutMargins {
self.layoutMargins = config.layoutMargins
}
}
}
// MARK: -
// TODO: Can this be moved to UIView+OWS.swift?
public extension CGRect {
var width: CGFloat {
get {
size.width
}
set {
size.width = newValue
}
}
var height: CGFloat {
get {
size.height
}
set {
size.height = newValue
}
}
}