gpt4 book ai didi

swift - 如何在 SwiftUI 中删除 `Form` 的顶部空间?

转载 作者:行者123 更新时间:2023-12-01 09:42:18 25 4
gpt4 key购买 nike

如何顶部对齐 FormNavigationView .当我删除 NaviagationView 时,我有以下内容从 body ,Form顶部对齐。与 NavigationView就地,我得到了中间的间距(添加了红色框以显示空间)。我可以用 .padding(.top, -20)在 Form 上,但是虽然这有效,但它会稍微扭曲一些东西。
Screenshot

NavigationView {
Form {
VStack {
HStack {
Text("Name:").underline().font(.headline)
TextField("Name", text: $routine.name)

}
roundPicker()
TimeSelectionView(stateName: "A", stateDuration: "0:30", stateBackground: "#df405a")
TimeSelectionView(stateName: "B", stateDuration: "1:30", stateBackground: "#4ea1d3")
TimeSelectionView(stateName: "C", stateDuration: "3:00", stateBackground: "#4f953b")
}
}
.navigationBarTitle("Create", displayMode: .inline)
.navigationBarItems(trailing:
Button(action: {
//Save Routine
self.routine.rounds = self.roundsArray[self.rounds]

print("Workout Name: \(self.routine.name)")
print("Workout Rounds: \(self.routine.rounds)")
}, label: {
Text("Save")
}
)
)
}

最佳答案

SwiftUI Form实际上是分组样式UITableView在引擎盖下,这是默认值 tableHeaderView .所以你可以像这样删除它:
iOS 13

struct ContentView: View {

init() { // this can be done in `onAppear` modifier if you need to restore the appereance later on `onDisappear`
UITableView.appearance().tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: Double.leastNonzeroMagnitude))
}

var body: some View {
,,,
}
}
iOS 14
Apple 正在限制 appearance破解并设置 tableHeaderView的框架就是其中之一,因此我们需要通过添加以下步骤来挖掘更多内容:
1. 使用约束代替 frame :
init() {
let view = UIView()
view.translatesAutoresizingMaskIntoConstraints = false
view.heightAnchor.constraint(equalToConstant: 0).isActive = true
UITableView.appearance().tableHeaderView = view
}
2.强制重新加载表:
约束已添加,但需要重新加载。 SwiftUI 不允许您手动重新加载列表。所以我们需要添加一个虚拟 View 和一个虚拟 state欺骗它:
@State var loaded = false // need for stay update
,,,

List {

if loaded {
Text("Actual content of the list")

} else {
Text("Dummy content. Not important")
.onAppear {
loaded = true // need for instatnt force update
}
}

}

注1:
永远不要对任何数字进行硬编码(例如 -35 表示插入!)。数字因设备、平台和状态等而异。
笔记2: .zero框架不起作用。如果你使用 frame,你应该至少通过一个最小高度适用于 iOS 13 或 UIKit .
注3:
所有方法都是 黑客 并且 Apple 正试图限制对基础类型的访问,例如 UITableView .因此,请及时了解最新信息并尝试帮助社区。
注4:
通过点赞和评论为社区做出贡献。所以人们会更有动力去未知的地方挖掘并给我们带来很酷的东西。
注5:
由于我们使用的是外观代理,因此任何更改都将应用于所有 TableView在应用程序中。您可以存储原始状态 Appearance -> 应用新样式 onAppear并恢复原样 onDisaper如果需要。

关于swift - 如何在 SwiftUI 中删除 `Form` 的顶部空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58681243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com