在SwiftUI模式中禁用拖动以关闭
我已经给出了一个模式视图,但我希望用户在它被取消之前先完成一些步骤。 当前,可以拖动视图以关闭视图 有没有办法阻止这一切的发生 我看了WWDC会议视频,他们提到了这一点,但我似乎无法确定我需要的确切代码在SwiftUI模式中禁用拖动以关闭,swiftui,Swiftui,我已经给出了一个模式视图,但我希望用户在它被取消之前先完成一些步骤。 当前,可以拖动视图以关闭视图 有没有办法阻止这一切的发生 我看了WWDC会议视频,他们提到了这一点,但我似乎无法确定我需要的确切代码 struct onboardingview 2:视图{ @装订 var dismissFlag:Bool var body:一些观点{ VStack{ Text(“在此登录!我有一个类似的问题 这里最重要的是它隐藏了后退按钮。这会关闭后退按钮,让用户无法向后滑动 对于应用程序的设置部分,您可以创
struct onboardingview 2:视图{
@装订
var dismissFlag:Bool
var body:一些观点{
VStack{
Text(“在此登录!我有一个类似的问题
这里最重要的是它隐藏了后退按钮。这会关闭后退按钮,让用户无法向后滑动
对于应用程序的设置部分,您可以创建一个新的SwiftUI文件,并添加一个类似的东西回家,同时还可以合并您自己的设置代码
struct SetUp : View {
let destinationView = Text("Your App Here")
.navigationBarItem(title: Text("Your all set up!"), titleDisplayMode: .automatic, hidesBackButton: true)
var body: some View {
NavigationView {
NavigationButton(destination: destinationView) {
Text("Done")
}
}
}
}
不确定这是否有助于显示您正在使用的模式,甚至不确定显示方法,但当您使用UIHostingController
从UIViewController
显示SwiftUI视图时
let vc = UIHostingController(rootView: <#your swiftUI view#>(<#your parameters #>))
let vc=UIHostingController(rootView:())
您可以设置一个modalPresentationStyle
。您可能需要决定哪种样式适合您的需要,但是。currentContext
阻止拖动
旁注:我不知道如何关闭从UIHostingController
显示的视图,但这就是为什么我在这里问了自己一个问题,以了解如果使用第三方库很容易,这非常有用,因为它可以轻松访问相应的UIKit组件。在这种情况下,UIViewController
中的属性:
VStack { ... }
.introspectViewController {
$0.isModalInPresentation = true
}
有一个扩展,使控制模态解雇毫不费力,在
苹果发布正式解决方案之前的临时解决方案
/// Example:
struct ContentView: View {
@State private var presenting = false
var body: some View {
VStack {
Button {
presenting = true
} label: {
Text("Present")
}
}
.sheet(isPresented: $presenting) {
ModalContent()
.allowAutoDismiss { false }
// or
// .allowAutoDismiss(false)
}
}
}
iOS 15
从iOS 15开始,我们可以使用InteractiveDiskDisabled
:
func interactiveDismissDisabled(_ isDisabled: Bool = true) -> some View
我们只需要将其附加到工作表上。以下是来自的示例:
罗布,你能把上面提到的WWDC视频的链接贴出来吗?@Prcela听起来不像-他在问如何禁用这个手势recognizer@Prcela不同的问题我会说:)你找到了解决这个问题的方法吗?@konrad.bajtyngier如果你还在寻找,我发布了一个不使用覆盖层的方法(ZStack)在Wow,非常感谢,我花了几秒钟通过swift package manager,然后又花了几秒钟添加它。这对我来说很有效,但只有当我将修改器应用到.sheet
修改器中的根视图时才有效。如果我将其应用到子视图,则没有任何效果。
func interactiveDismissDisabled(_ isDisabled: Bool = true) -> some View
struct PresentingView: View {
@Binding var showTerms: Bool
var body: some View {
AppContents()
.sheet(isPresented: $showTerms) {
Sheet()
}
}
}
struct Sheet: View {
@State private var acceptedTerms = false
var body: some View {
Form {
Button("Accept Terms") {
acceptedTerms = true
}
}
.interactiveDismissDisabled(!acceptedTerms)
}
}