新的 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 未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章
在悬停时使用 jQuery .animate 显示新的 div
按下按钮时 SwiftUI 2.0 iOS 14 Core 数据删除实例