gpt4 book ai didi

ios - 动画 View 以在 SwiftUI 中向上滑动和隐藏

转载 作者:行者123 更新时间:2023-12-04 12:23:10 27 4
gpt4 key购买 nike

我创建了一个横幅修改器,从顶部显示横幅。这动画很好。但是,当我点击以关闭它时,它根本没有动画,即使点击手势操作具有 withAnimation 也会隐藏。包裹它。

struct BannerModifier: ViewModifier {
@Binding var model: BannerData?

func body(content: Content) -> some View {
content.overlay(
Group {
if model != nil {
VStack {
HStack(alignment: .firstTextBaseline) {
Image(systemName: "exclamationmark.triangle.fill")
VStack(alignment: .leading) {
Text(model?.title ?? "")
.font(.headline)
if let message = model?.message {
Text(message)
.font(.footnote)
}
}
}
.padding()
.frame(minWidth: 0, maxWidth: .infinity)
.foregroundColor(.white)
.background(.red)
.cornerRadius(10)
.shadow(radius: 10)
Spacer()
}
.padding()
.animation(.easeInOut)
.transition(AnyTransition.move(edge: .top).combined(with: .opacity))
.onTapGesture {
withAnimation {
model = nil
}
}
.gesture(
DragGesture()
.onChanged { _ in
withAnimation {
model = nil
}
}
)
}
}
)
}
}

struct BannerData: Identifiable {
let id = UUID()
let title: String
let message: String?
}
enter image description here
在点击手势中,我删除了模型但它没有动画。它只会立即隐藏。我怎样才能动画它使它向上滑动,这与它向下滑动显示的方式相反?如果我也可以使拖动手势具有交互性,这样我就可以像 native 通知一样将其滑出,那就太好了。

最佳答案

从层次结构中删除 View 始终由容器动画,因此要修复您的修改器,需要应用 .animation在一些辅助容器上(注意:Group 实际上不是真正的容器)。
demo
这是更正的变体

struct BannerModifier: ViewModifier {
@Binding var model: BannerData?

func body(content: Content) -> some View {
content.overlay(
VStack { // << holder container !!
if model != nil {
VStack {
HStack(alignment: .firstTextBaseline) {
Image(systemName: "exclamationmark.triangle.fill")
VStack(alignment: .leading) {
Text(model?.title ?? "")
.font(.headline)
if let message = model?.message {
Text(message)
.font(.footnote)
}
}
}
.padding()
.frame(minWidth: 0, maxWidth: .infinity)
.foregroundColor(.white)
.background(Color.red)
.cornerRadius(10)
.shadow(radius: 10)
Spacer()
}
.padding()
.transition(AnyTransition.move(edge: .top).combined(with: .opacity))
.onTapGesture {
withAnimation {
model = nil
}
}
.gesture(
DragGesture()
.onChanged { _ in
withAnimation {
model = nil
}
}
)
}
}
.animation(.easeInOut) // << here !!
)
}
}
使用 Xcode 12.1/iOS 14.1 和测试 View 进行测试:
struct TestBannerModifier: View {
@State var model: BannerData?
var body: some View {
VStack {
Button("Test") { model = BannerData(title: "Error", message: "Fix It!")}
Button("Reset") { model = nil }
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.modifier(BannerModifier(model: $model))
}
}

关于ios - 动画 View 以在 SwiftUI 中向上滑动和隐藏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65856543/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com