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

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

设置:

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

问题:

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

期望的结果:

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

Video of the problem

Project file with sample app

【问题讨论】:

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

标签: ios swift animation swiftui


【解决方案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()
    }
}

【讨论】:

  • 我已经完成了类似的解决方案。这是最好的,除了我想要的解锁时没有“向下滑动”动画。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
  • 2019-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-30
相关资源
最近更新 更多