簡體   English   中英

SwiftUI:顯示不帶 animation 的全屏覆蓋

[英]SwiftUI: show fullScreenCover without animation

由於“缺乏技術細節”, 這個驚人的問題被關閉了,所以我肯定會在這里放很多。

設置:

  1. 創建 iOS SwiftUI 應用程序
  2. 添加文件如下
  3. 觀察問題

AppleApp.swift

import SwiftUI

@main
struct AppleApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

ContentView.swift

import SwiftUI

struct ContentView: View {
    @State var isLocked = true

    var body: some View {
        VStack {
            Text("Unlocked view")
                .padding()
        }.fullScreenCover(isPresented: $isLocked) {

        } content: {
            LockScreen($isLocked)
        }


    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

LockScreen.swift

import SwiftUI

struct LockScreen: View {
    @Binding var isLocked: Bool

    init(_ isLocked: Binding<Bool>) {
        self._isLocked = isLocked
    }

    var body: some View {
        ZStack {
            Color.gray
            VStack {
                Text("Locked")
                Button("Unlock") {
                    print("unlock button pressed")
                    isLocked = false
                }
            }
        }
    }
}

struct LockScreen_Previews: PreviewProvider {
    @State static var isLocked: Bool = true
    static var previews: some View {
        LockScreen($isLocked)
    }
}

問題:

看一下視頻:應用程序啟動后,“解鎖視圖”可見,並且在 animation 短暫延遲后出現“LockScreen”。

期望的結果:

該應用程序在啟動后顯示“LockScreen”,但可以通過按“解鎖”按鈕將其關閉。

問題視頻

帶有示例應用程序的項目文件

根據您對@AlexanderThoren answere 的評論。 我添加了 animation 並簡化了代碼。

添加過渡 animation。

添加此擴展以隱藏 - 顯示視圖。

extension View {
    func showLockView(isLocked: Binding<Bool>) -> some View {
        ZStack {
            self
            if isLocked.wrappedValue {
                LockScreen(isLocked: isLocked).animation(.default).transition(AnyTransition.move(edge: .bottom))
            }
        }
        .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
    }
}

並將其與您的內容視圖一起使用

struct ContentView: View {
    @State var isLocked = true
    
    var body: some View {
        VStack {
            Text("Unlocked view")
                .padding()
        }
        .showLockView(isLocked: $isLocked) // << Here
    }
}

編輯:正如評論中提到的,這里是沒有查看擴展的解決方案。

struct ContentView: View {
    @State var isLocked = true
    
    var body: some View {
        ZStack {
            VStack {
                Text("Unlocked view")
                    .padding()
            }
            if isLocked {
                LockScreen(isLocked: $isLocked)
                    .edgesIgnoringSafeArea(.all)
                    .animation(.default)
                    .transition(AnyTransition.move(edge: .bottom))
            }
        }
    }
}

希望您覺得這個有幫助。 我知道它沒有 FullScreenCover,但這會立即顯示出來。

import SwiftUI

struct ContentView: View {
    @State var isLocked = true
    
    var body: some View {
        if self.isLocked {
            LockScreen(isLocked: self.$isLocked)
        } else {
            VStack {
                Text("Unlocked view")
                    .padding()
            }
        }
    }
}

struct LockScreen: View {
    @Binding var isLocked: Bool
    
    var body: some View {
        ZStack {
            Color.gray
            VStack {
                Text("Locked")
                Button("Unlock") {
                    print("unlock button pressed")
                    isLocked = false
                }
            }
        }
        .ignoresSafeArea()
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM