Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何为视图生命周期事件(onAppear、OnDiskAppear)制作可重用的修改器?_Ios_Swift_Swiftui - Fatal编程技术网

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)
}

希望这有助于您使用视图扩展来实现相同的功能,并可为每个视图重用。