๐ViewPreference
๐พ ็จๅผ๏ผhttps://github.com/lochiwei/ViewPreferences/tree/main
/*
History:
2021.??.?? - first version
2022.01.18 + reportWidth, actOnWidth, actOnSelfWidth, ViewPreference.Width
*/
import SwiftUI
/// ๐
ฟ๏ธ HasDefaultValue
public protocol HasDefaultValue {
static var defaultValue: Self { get }
}
// ------------------------------------------
// `HasDefaultValue` conforming types
// ------------------------------------------
/// ๐ CGSize
extension CGSize: HasDefaultValue {
public static var defaultValue: Self { .zero }
}
/// ๐ CGRect
extension CGRect: HasDefaultValue {
public static var defaultValue: Self { .zero }
}
/// ๐ CGFloat
extension CGFloat: HasDefaultValue {
public static var defaultValue: Self { .zero }
}
// -----------------------
// ViewPreference
// -----------------------
/// ๐ธ ViewPreference
public enum ViewPreference {
// ๅฐๆ้ bounds anchor ็่ณ่จๆพๅฐ view extension methods ็ๅๆธไธญ๏ผ
// ็ก้่ฎ method name ไธ่ฆๅคช้ทใ
public enum BoundsAnchorType {
case first
case last
}
/// โญ ViewPreference type aliases
public typealias Size = ViewPreference.First<CGSize>
public typealias Width = ViewPreference.First<CGFloat>
/// anchor preferences
public typealias FirstBoundsAnchor = ViewPreference.FirstNonNil<Anchor<CGRect>>
public typealias LastBoundsAnchor = ViewPreference.LastNonNil<Anchor<CGRect>>
/// ๐ธ ViewPreference.First
public enum First<T: HasDefaultValue>: PreferenceKey {
public typealias Value = T
public static var defaultValue: Value { Value.defaultValue }
public static func reduce(value: inout Value, nextValue: () -> Value) {
// โญ ignore all values other than the first
}
}
/// ๐ธ ViewPreference.FirstNonNil<T>
public enum FirstNonNil<T>: PreferenceKey {
public typealias Value = T?
public static var defaultValue: Value { nil }
public static func reduce(value: inout Value, nextValue: () -> Value) {
value = value ?? nextValue() // nil or first non-nil value
}
}
/// ๐ธ ViewPreference.LastNonNil<T>
public enum LastNonNil<T>: PreferenceKey {
public typealias Value = T?
public static var defaultValue: Value { nil }
public static func reduce(value: inout Value, nextValue: () -> Value) {
value = nextValue() ?? value // nil or last non-nil value
}
}
}
History
2021.??.?? - first version
2022.01.18 + reportWidth, actOnWidth, actOnSelfWidth, ViewPreference.Width
Last updated
Was this helpful?