Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SwiftUI模式中禁用拖动以关闭_Swiftui - Fatal编程技术网

在SwiftUI模式中禁用拖动以关闭

在SwiftUI模式中禁用拖动以关闭,swiftui,Swiftui,我已经给出了一个模式视图,但我希望用户在它被取消之前先完成一些步骤。 当前,可以拖动视图以关闭视图 有没有办法阻止这一切的发生 我看了WWDC会议视频,他们提到了这一点,但我似乎无法确定我需要的确切代码 struct onboardingview 2:视图{ @装订 var dismissFlag:Bool var body:一些观点{ VStack{ Text(“在此登录!我有一个类似的问题 这里最重要的是它隐藏了后退按钮。这会关闭后退按钮,让用户无法向后滑动 对于应用程序的设置部分,您可以创

我已经给出了一个模式视图,但我希望用户在它被取消之前先完成一些步骤。 当前,可以拖动视图以关闭视图

有没有办法阻止这一切的发生

我看了WWDC会议视频,他们提到了这一点,但我似乎无法确定我需要的确切代码

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)
    }
}