新的 SwiftUI/iOS 15.0 .animation 未按预期工作

Posted

技术标签:

【中文标题】新的 SwiftUI/iOS 15.0 .animation 未按预期工作【英文标题】:New SwiftUI/iOS 15.0 .animation not working as intended 【发布时间】:2021-07-13 13:58:25 【问题描述】:

我有一个自定义提醒,我正试图在演示时从屏幕顶部向下滑动。我正在为 ios 15 使用过渡和新的 .animation 修饰符:

import SwiftUI

struct SlideOverAlert: View 
    var text: String
    @Binding var isPresented: Bool
    var dismissAction: () -> Void
    
    var body: some View 
        if isPresented 
            ZStack 
                Rectangle()
                    .edgesIgnoringSafeArea(.top)
                    .frame(height: 80)
                    .foregroundColor(.orange)
                HStack 
                    Text(text)
                    Spacer()
                    Button(action: dismissAction) 
                        Image(systemName: "xmark")
                    
                
                .foregroundColor(.white)
                .padding()
            
            .transition(.move(edge: isPresented ? .top : .bottom))
            .animation(.default, value: isPresented)
        
    

我的代码不起作用。而且我不知道为什么......

这是我的预览代码:

struct SlideOverAlert_Previews: PreviewProvider 
    static var previews: some View 
        ContentView()
    
    
    struct ContentView: View 
        @State var alertIsPresented = true
        
        var body: some View 
            GeometryReader  _ in
                ZStack(alignment: .top) 
                    VStack 
                        Spacer()
                        Button(action:  alertIsPresented.toggle() ) 
                            Text("Toggle")
                        
                        Spacer()
                    
                    SlideOverAlert(
                        text: "That isn't going to work",
                        isPresented: $alertIsPresented
                    ) 
                        alertIsPresented.toggle()
                    
                
            
        
    

【问题讨论】:

尝试设置这样的动画.animation(.default) .transition(.asymmetric(insertion: .move(edge: .bottom), removal: .move(edge: .top))) .animation(.default) 不带value: 已弃用,请参阅:hackingwithswift.com/articles/235/… 【参考方案1】:

如果您尝试构建自定义警报,我建议您使用新的fullScreenCover (IOS 14+)。在您的预览/内容视图中,它看起来像这样:

// Attach the custom Alert to the view, bound to our state variable
.fullScreenCover(isPresented: $alertIsPresented) 
     SlideOverAlert()

这样,您不需要将状态变量传递给SliderOverAlert,然后在SlideOverAlert 中,您就可以在@Environment 演示模式的包装值上调用dismiss() 来关闭视图。干净多了。如果您需要保持背景清晰,请参阅this answer。 也就是说,这些建议不会产生您正在寻找的 向下滑动 效果。如果您对这种效果死心塌地,我可能会建议以下其中一项。过渡似乎不是这里最好的解决方案。 答。 使用MatchedGeometryEffect 在您尝试显示的视图的两个不同变体之间设置动画。如果您想让包括按钮在内的所有内容都平滑地动画化,这可能更可取,因为MatchedGeometryEffect 在转换后的视图之间保持成比例的间距。 乙。 保持您的代码不变,但删除您的 if 语句并将您的 .transition( 行替换为如下内容:.offset(x: 0, y: isPresented ? 0 : -1000)。不过,理想情况下,使用GeometryReader 来确定您的偏移量,而不是像 1000 这样的原始值。这应该会导致您的视图以编程方式进出动画,代价是视图始终存在,即使它不在视线范围内。但是,与 A. 不同的是,在整个动画过程中,视图将保持静态。

【讨论】:

谢谢,但我不是在寻找全屏...只是一些可以点击的小东西(通知框架 = height: 80

以上是关于新的 SwiftUI/iOS 15.0 .animation 未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

如何修复自定义按钮在 SwiftUI(IOS) 中的交互?

自定义“可搜索”搜索字段 SwiftUI iOS 15

在悬停时使用 jQuery .animate 显示新的 div

按下按钮时 SwiftUI 2.0 iOS 14 Core 数据删除实例

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

SwiftUI iOS - 如何使用捕获的硬件按键事件