SwiftUI:如何设置 SHEET 的大小,但同时使其可拖动

问题描述 投票:0回答:1

我的视图上有一张简单的工作表。该工作表从一开始就有特定的高度,但用户可以将其拖动到 .medium 和 .large 高度。

纸张上有一个按钮。当按钮被标记时,工作表应该以新的高度显示。之后,用户可以像以前一样拖动工作表。

问题:我可以使用

 .presentationDetents([.height(40), .medium, .large])
定义用户可以将工作表拖动到的高度。但我还没有到达将床单设置在特定高度(例如 200)。

当我定义像

 .presentationDetents([.height(200)])
这样的自定义高度时,它会将工作表设置为200。但是用户不再可以拖动它,因为我必须消除其他高度(.medium.large) .

这是我的代码:

import SwiftUI

struct ContentView: View {
    @State private var sheetSize: Float = 60
    var body: some View {
        
        Text("Hello")
            
            .sheet(isPresented: .constant(true)) {
                
                Button {
                    if sheetSize == 40 {
                        sheetSize = 200     // THIS DOES NOT WORK.
                    }
                    else {
                        sheetSize = 60
                    }
                    
                    print("sheetSize:", sheetSize)
                } label: {
                    Image(systemName: "button.programmable")
                        .font(.largeTitle)
                        .frame(maxWidth: .infinity, alignment: .center)
                }
                
                .presentationDetents([.height(CGFloat(sheetSize)), .medium, .large])
                .interactiveDismissDisabled()
                .presentationDragIndicator(.visible)
                
                
                
            } // Sheet
                
                    
    }// var body
}// struct


#Preview {
    ContentView()
}
swift swiftui view size
1个回答
0
投票

传递

Binding<PresentationDetent>
selection
参数以编程方式更改制动装置。

这里我添加了一个名为

@State
的新
currentDetent
来跟踪当前的制动装置。除了在按钮操作中设置
sheetSize
之外,您还应该设置它。

@State private var sheetSize: CGFloat = 60
@State private var currentDetent = PresentationDetent.height(60)
var body: some View {
    
    Text("Hello")
    
        .sheet(isPresented: .constant(true)) {
            
            Button {
                if sheetSize == 60 {
                    sheetSize = 200
                    currentDetent = .height(200)
                } else {
                    sheetSize = 60
                    currentDetent = .height(60)
                }
                
                print("sheetSize:", sheetSize)
            } label: {
                Image(systemName: "button.programmable")
                    .font(.largeTitle)
                    .frame(maxWidth: .infinity, alignment: .center)
            }
            
            .presentationDetents([.height(sheetSize), .medium, .large], selection: $currentDetent)
            .interactiveDismissDisabled()
            .presentationDragIndicator(.visible)
        }
}
© www.soinside.com 2019 - 2024. All rights reserved.