SwiftUI:在没有动画的情况下显示 fullScreenCover [关闭]

Posted

技术标签:

【中文标题】SwiftUI:在没有动画的情况下显示 fullScreenCover [关闭]【英文标题】:SwiftUI: show fullScreenCover without animation [closed] 【发布时间】:2021-11-26 10:38:39 【问题描述】:

This amazing question 因“缺乏技术细节”而被关闭,所以我肯定会在这里放很多。

设置:

    创建 ios SwiftUI 应用 添加文件如下 观察问题

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)
    

问题:

观看视频:应用启动后,“解锁视图”可见,并且在动画短暂延迟后出现“LockScreen”。

期望的结果:

应用程序在启动后会显示“LockScreen”,但可以通过按“解锁”按钮将其关闭。

Video of the problem

Project file with sample app

【问题讨论】:

这能回答你的问题吗? SwiftUI remove transition of fullscreen cover 完全没有,因为它只是延迟了过渡开始的时间。 刚刚用我的方式尝试了你的代码工作正常。.onAppear() withoutAnimation isLocked = true 刚刚添加了这个并最初为 isLocked 设置了 false 你需要它来做全屏封面吗?我有一个不同的方法,也许你会更喜欢。在您向项目添加 Splash 之前,它始终会首先显示白屏。 这是否回答了您的问题***.com/a/69717515/12299030? 【参考方案1】:

根据您对@AlexanderThoren answere 的评论。我添加了动画并简化了代码。

添加过渡动画。

添加此扩展以隐藏 - 显示视图。

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

【讨论】:

能否请您重写您的代码以便没有扩展?谢谢。 最好使用扩展程序,或者您可以在编辑之前检查我的代码。刚刚得到编辑的历史记录。 只需将其编辑回去 :) 或发布两个解决方案,您的第一个版本同样有趣。谢谢! @RichardTopchii 已编辑【参考方案2】:

希望你觉得这很有用。我知道它没有 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()
    

【讨论】:

我已经完成了类似的解决方案。这是最好的,除了我想要的解锁时没有“向下滑动”动画。

以上是关于SwiftUI:在没有动画的情况下显示 fullScreenCover [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 多张纸:关闭动画损坏

SwiftUI / iOS |在没有 NSNotification 的情况下获取键盘大小

SwiftUI:动画列表中的圆圈

SwiftUI 动画如何与子视图隔离?

如何在 SwiftUI 中制作“显示”式的折叠/展开动画?

同一视图中的 SwiftUI 动画显示方式不同