💈Collapsible
可以收合或展開的 HStack。
我們在 2 號的矩形上放了 .onTapGesture(),所以點它就可收合或展開整個橫向堆疊 (HStack)。

/*
* Thinking in SwiftUI, Ch. 4, Exercises
*
* ⭐️ Required: 🌀View + .if
*/
import SwiftUI
import PlaygroundSupport
// 📦 Collapsible
struct Collapsible<Item, Content: View>: View {
// the HStack is expanded or not
@State private var expanded = false
// items to present in the HStack
var items: [Item]
// ⭐️ turn `Item` into `Content` view
var content: (Item) -> Content
// ⭐️ make i-th child view from items[i]
func child(at i: Int) -> some View {
// ⭐️ show child if expanded or last one
let isLastOne = i == self.items.endIndex - 1
let show = expanded || isLastOne
// ⭐️ if collapsed, shrink width to 10
let width: CGFloat? = show ? nil : 10
return content(items[i])
.frame(width: width)
.animation(.default)
.if(isLastOne){ // 🌀View + .if
$0.onTapGesture { self.expanded.toggle() }
}
} // child(at:)
// body of Collapsible
var body: some View {
let s: CGFloat = expanded ? 8 : 0 // spacing
return HStack(spacing: s) {
ForEach(items.indices) { self.child(at: $0) }
}
}
}
Last updated
Was this helpful?