๐ ฟ๏ธPreferenceKey
// ------------------------
// ๐
ฟ๏ธ PreferenceKey
// ------------------------
public protocol PreferenceKey {
// value type
associatedtype Value
// default value
static var defaultValue: Self.Value { get }
// combine values from different children
static func reduce(
value : inout Self.Value,
nextValue: () -> Self.Value
)
}
// ------------------------
// View methods
// ------------------------
// ๐ธ (child view) set view preference
func preference<K: PreferenceKey>(
key : K.Type = K.self,
value: K.Value
) -> some View
// ๐ธ .onPreferenceChange()
// (parent view) react to view preference change
func onPreferenceChange<K>(
_ key: K.Type = K.self,
perform action: @escaping (K.Value) -> Void
) -> some View where
K : PreferenceKey,
K.Value : Equatable
// ๐ธ .overlayPreferenceValue(key:transform:)
func overlayPreferenceValue<Key: PreferenceKey, T: View>(
_ key: Key.Type = Key.self,
_ transform: @escaping (Key.Value) -> T
) -> some View
// ๐ธ .backgroundPreferenceValue(key:transform:)
func backgroundPreferenceValue<Key: PreferenceKey, T: View>(
_ key: Key.Type = Key.self,
_ transform: @escaping (Key.Value) -> T
) -> some ViewSwiftOnTap โฉ PreferenceKey
can cause subtle problems, ๐ problem with .readSize().
Preferences
๐ฆ PreferenceKeys
๐ฆ Anchor
็ฏไพ
// ๐ฆ MaxValue<T: FloatingPoint>
public struct MaxValue<T: FloatingPoint>: PreferenceKey {
// value type
public typealias Value = T?
// default value (nil == not set)
public static var defaultValue: Value { nil }
// โญ๏ธ choose max value
public static func reduce(value: inout Value, nextValue: () -> Value) {
// โญ๏ธ [T?] --(compactMap)--> [T] --(max)--> T?
value = [value, nextValue()].compactMap{ $0 }.max()
}
}// ๐ฆ AllValues<T>
public struct AllValues<T>: PreferenceKey {
// โญ๏ธ ๆถ้็่ณๆๆพๅจ [T] ่ฃก้ข
public typealias Value = [T]
// โญ๏ธ ๅๅงๅผ๏ผ็ฉบ้ฃๅ
public static var defaultValue: Value { Value() }
// โญ๏ธ ๅ ๅ
ฅๆฐ่ณๆ็ๆนๆณ๏ผ[v1, v2, ...] + [vn]
public static func reduce(value: inout Value, nextValue: () -> Value) {
value += nextValue() // nextValue() == [vn]
}
}๐ ๅฐ้ฝๆฌไฝ (
MaxWidth = MaxValue<CGFloat>)๐ MonthView (
Frames = AllValues<CGRect>)๐ CircleText (
MaxSide = FirstNonNil<CGFloat>)
๐View + pref โญ
๐ฆ PreferenceKeys
Preferences
็จๆณ
่จญ K ็บ้ตๅพช PreferenceKey ็็ๅฏฆๅๅฅ (concrete type)๏ผๅไฝฟ็จ้ๅ PreferenceKey ๆ๏ผ้ๅธธๅฟ ้ ๅ ทๅไปฅไธใไธๅคง่ฆ็ด ใ๏ผ
ๆไบ้ไบ่ฆ็ด ๅพ๏ผ้่ฆไพ็ งๅบๅฎ็ๆจกๅผ๏ผๆ่ฝ้ ๅฉๅฎๆไฝๅฑ๏ผไธป่ฆๆฏไปฅไธ็ใไธๆญฅ้ฉใ๏ผ
ๆดๅๆต็จๅฏไปฅ็ฐกๅ็บ๏ผ
๐ ๆฏ่ผ๏ผAnchor Preferences
โญ๏ธ ๅๅๅๅ
PreferenceKey ็ๅๅญๆๅฅฝๆฏ่ทๆฏ่ฆไปถ็ @State ่ฎๆธไธ่ด๏ผไพๅฆ๏ผ ๅฆๆๆๅ่ฆๆพ็ๆฏๆๅๅญ่ฆไปถๅ ฉ้้ทไธญ็ๆๅคง้๏ผ้ๆๅฏไปฅ๏ผ
ๅฐๆฏ่ฆไปถ็ @State ่ฎๆธๅๅ็บ๏ผ
maxSide่ PreferenceKey ๅฐฑๅๅ็บ:
MaxSide
๐ ๅ่ฆ๏ผ๐ CircleText
๐ ่ช่ฃฝๅๅฅ๏ผ๐ฆ PreferenceKeys
Last updated
Was this helpful?