Ios 如何为视图生命周期事件(onAppear、OnDiskAppear)制作可重用的修改器?
我有一个常见的Ios 如何为视图生命周期事件(onAppear、OnDiskAppear)制作可重用的修改器?,ios,swift,swiftui,Ios,Swift,Swiftui,我有一个常见的fadeIn和fadeOut动画,用于视图出现和消失时: struct ActiveView: View { @State var showCode: Bool = false @State var opacity = 0.0 var body: some View { if self.showCode { Color.black.opacity(0.7) .onAppear{
fadeIn
和fadeOut
动画,用于视图出现和消失时:
struct ActiveView: View {
@State var showCode: Bool = false
@State var opacity = 0.0
var body: some View {
if self.showCode {
Color.black.opacity(0.7)
.onAppear{
let animation = Animation.easeIn(duration: 0.5)
return withAnimation(animation) {
self.opacity = 1
}
}
.onDisappear{
let animation = Animation.easeOut(duration: 0.5)
return withAnimation(animation) {
self.opacity = 0
}
}
}
}
}
但是,我希望在其他视图上使用相同的动画,因此我希望它简单且可重用,如下所示:
if self.showCode {
Color.black.opacity(0.7)
.fadeAnimation()
}
if self.showCode {
Color.black.opacity(0.7)
.transition(.fadeTransition)
}
我怎样才能做到这一点
编辑:
正在尝试实现视图扩展:
extension View {
func fadeAnimation(opacity: Binding<Double>) -> some View {
self.onAppear{
let animation = Animation.easeIn(duration: 0.5)
return withAnimation(animation) {
opacity = 1
}
}
.onDisappear{
let animation = Animation.easeOut(duration: 0.5)
return withAnimation(animation) {
opacity = 0
}
}
}
}
扩展视图{
func fadeAnimation(不透明度:绑定)->一些视图{
自我表现{
让动画=animation.easeIn(持续时间:0.5)
使用动画返回(动画){
不透明度=1
}
}
翁迪萨佩尔先生{
让动画=动画.easeOut(持续时间:0.5)
使用动画返回(动画){
不透明度=0
}
}
}
}
您尝试执行的操作已经存在,并命名为“不透明度转换”,它用一个修饰符编写
下面是一个演示:
您尝试实现的功能已经是SwiftUI中动画和过渡修改器的一部分 因此,您可以将
.transition
修改器添加到任何视图
,它将为其插入和删除设置动画
if self.showCode {
Color.black.opacity(0.7)
.transition(AnyTransition.opacity.animation(.easeInOut(duration: 0.5)))
}
您可以使用多种不同的转换,如.slide
、scale
、offset
等。有关转换的详细信息
您甚至可以使用不同的插入和删除操作创建自定义转换。在您的情况下,将显示不同的动画曲线
extension AnyTransition {
static var fadeTransition: AnyTransition {
.asymmetric(
insertion: AnyTransition.opacity.animation(.easeIn(duration: 0.5)),
removal: AnyTransition.opacity.animation(.easeOut(duration: 0.5))
)
}
}
然后像这样使用它:
if self.showCode {
Color.black.opacity(0.7)
.fadeAnimation()
}
if self.showCode {
Color.black.opacity(0.7)
.transition(.fadeTransition)
}
希望这有助于您使用视图扩展来实现相同的功能,并可为每个视图重用。