【发布时间】:2020-10-03 03:08:42
【问题描述】:
我有以下例子:
import SwiftUI
struct TestSO: View {
@State var cards = [
Card(title: "short title text", subtitle: "short title example"),
Card(title: "medium title text text text text text", subtitle: "medium title example"),
Card(title: "long title text text text text text text text text text text text text text text text text text",
subtitle: "long title example"),
Card(title: "medium title text text text text text", subtitle: "medium title example"),
Card(title: "short title text", subtitle: "short title example"),
]
@State var showDetails = false
var body: some View {
NavigationView {
ScrollView {
VStack {
ForEach(cards.indices) { index in
GeometryReader { reader in
CardView(showDetails: self.$showDetails, card: self.cards[index])
.offset(y: self.showDetails ? -reader.frame(in: .global).minY : 0)
.onTapGesture {
self.showDetails.toggle()
self.cards[index].showDetails.toggle()
}
}.frame(height: self.showDetails ? UIScreen.main.bounds.height : 80, alignment: .center)
}
}
}.navigationBarTitle("Content", displayMode: .large)
}
}
}
struct CardView : View {
@Binding var showDetails : Bool
var card : Card
var body: some View {
VStack(alignment: .leading){
HStack{
Text(card.subtitle).padding([.horizontal, .top]).fixedSize(horizontal: false, vertical: true)
Spacer()
}
Text(card.title).fontWeight(Font.Weight.bold).padding([.horizontal, .bottom]).fixedSize(horizontal: false, vertical: true)
if(card.showDetails && showDetails) {
Spacer()
}
}
.background(Color.white)
.cornerRadius(16)
.shadow(radius: 12)
.padding()
.opacity(showDetails && card.showDetails ? 1 : (!showDetails ? 1 : 0))
}
}
struct Card : Identifiable{
var id = UUID()
var title : String
var subtitle : String
var showDetails : Bool = false
}
这是一张卡片列表,如果用户点击它就会展开。这里的问题是.frame(height: self.showDetails ? UIScreen.main.bounds.height : 80, alignment: .center) 行。根据 Card-Object 的标题或副标题有多少文本,CardView 必须小于或大于 80。我需要计算高度并使用它而不是固定的 80。
外观:
知道如何为 CardView 子级使用具有可变高度的 GeometryReader 吗?
提前致谢!
【问题讨论】:
-
如果 Card 正确计算自己的尺寸,为什么还需要 GeometryReader?看起来你引入了没有的问题,而不是解决真正的问题。
-
老实说,这比我们想象的要困难得多(至少对我来说:D)Apple 限制预览中的文本长度是有原因的。特别是在我们介绍了
GeomtryReader之后,我知道我们需要它,但我们需要它来扩展视图,所以除非有更好的方法来扩展视图,否则我认为这是一项相当艰巨的任务(再次,至少对我来说)。跨度> -
好的,我发现问题出在使用的硬代码上(这里和那里),但我不明白你想得到什么。哪个是正确的预期行为、外观和感觉?
标签: foreach swiftui geometryreader