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 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章