iOS16:
如果您有多个定位器,则会自动添加它,因此对于仅一个定位器,您需要明确指定其可见性:
yourContentView
.presentationDetents([.medium])
.presentationDragIndicator(.visible)
拖动指示器
。关于如何在早期的iOS版本中模拟这个拖动指示器已经提出了一些建议。
作为对John M.和happymacaron的精彩答案的小补充,这个方法更接近实现:
ZStack(alignment: .top) {
// NavigationView
Capsule()
.fill(Color.secondary)
.opacity(0.5)
.frame(width: 35, height: 5)
.padding(6)
}
我认为并没有一个被广泛接受的名称;通常我称其为拖动手柄,因为它是为了告诉用户可拖动区域而存在的。
在表格中没有内置语法来添加这个控件。这就是 SwiftUI 的好处 - 简单的控件易于实现和定制。
为了完整起见,您可以使用以下方法之一来创建一个:
VStack {
Capsule()
.fill(Color.secondary)
.frame(width: 30, height: 3)
.padding(10)
// your sheet content here
Spacer()
}
除了John M.的精彩回答之外,您还可以使用ZStack
将Capsule放置在NavigationView
的顶部,像这样:
ZStack(alignment: .top) {
// NavigationView
Capsule()
.fill(Color.secondary)
.frame(width: 35, height: 5)
}
我尝试了不同的大小,发现width: 35, height: 5
可以产生接近图片的形状。
IOS 16 / Xcode 14 更新
在这些出色的答案基础上,我有几个表格可以通过 ActiveSheet 枚举呈现,并希望为所有表格嵌入一个顶部/拖动栏。我还使用了 IOS16 的新 presentationDetents。
@ViewBuilder
private func sheetView(with item: ActiveSheet) -> some View {
VStack {
Capsule()
.fill(Color.secondary)
.frame(width: 45, height: 5)
.padding()
switch item {
case .addItem:
AddItemView(activeSheet: $activeSheet, list: $selectedList) // bind a list here
case .addList:
AddListView(activeSheet: $activeSheet)
case .showParticipants (let participants, let list):
ParticipantView(listOfParticipants: participants, list: list)
default:
EmptyView()
}
Spacer()
}.presentationDetents([.medium, .large])
}