如何做一个简单的缩放动画,为啥这不起作用?

Posted

技术标签:

【中文标题】如何做一个简单的缩放动画,为啥这不起作用?【英文标题】:how to do a simple scaling animation and why isn't this working?如何做一个简单的缩放动画,为什么这不起作用? 【发布时间】:2020-04-03 13:32:37 【问题描述】:

我刚刚在***中读到我只能连接延迟动画,所以我在这里尝试了这个,它只是缩小然后再次缩放圆圈。不幸的是,缩小不起作用!?如果我注释掉不断增长的、萎缩的作品……

struct ContentView: View 
    
    @State var scaleImage : CGFloat = 1
    
    var body: some View 
        VStack 
            Button(action: 
                withAnimation(Animation.easeInOut(duration: 1)) 
                    self.scaleImage = 0.01
                
                
                withAnimation(Animation.easeInOut(duration: 1).delay(1.0)) 
                    self.scaleImage = 1
                
            ) 
                Text ("Start animation")
            
            Image(systemName: "circle.fill")
                .scaleEffect(scaleImage)
        
    

【问题讨论】:

【参考方案1】:

这是可能的方法(基于AnimatableModifier)。实际上,它演示了如何检测当前动画结束并执行某些操作 - 在这种情况下,对于您的缩放场景,只需启动反转。

使用 Xcode 11.4 / ios 13.4 测试

简化和修改您的示例

struct TestReversingScaleAnimation: View 

    @State var scaleImage : CGFloat = 1

    var body: some View 
        VStack 
            Button("Start animation") 
                self.scaleImage = 0.01       // initiate animation
            

            Image(systemName: "circle.fill")
                .modifier(ReversingScale(to: scaleImage) 
                    self.scaleImage = 1      // reverse set
                )
                .animation(.default)         // now can be implicit
        
    

实际上,这里的节目制作人...重要的 cmets inline。

struct ReversingScale: AnimatableModifier 
    var value: CGFloat

    private var target: CGFloat
    private var onEnded: () -> ()

    init(to value: CGFloat, onEnded: @escaping () -> () = ) 
        self.target = value
        self.value = value
        self.onEnded = onEnded // << callback
    

    var animatableData: CGFloat 
        get  value 
        set  value = newValue
            // newValue here is interpolating by engine, so changing
            // from previous to initially set, so when they got equal
            // animation ended
            if newValue == target 
                onEnded()
            
        
    

    func body(content: Content) -> some View 
        content.scaleEffect(value)
    

【讨论】:

在 ViewModifier 中使用 ReversingScale 时出现以下错误。 Modifying state during view update, this will cause undefined behavior.。你有什么想法吗? @schinj:Asperi 展示的方式是个好方法,您需要使用 DispatchQueue 设置值以及一个小的 deadLine,然后它可以解决问题。

以上是关于如何做一个简单的缩放动画,为啥这不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥最简单的补丁创建示例不起作用?

当我将 UIView 动画放在不同类的 containerView 中时,为啥我的 UIView 动画不起作用?

动画在wordpress中不起作用

为啥我的简单 C 宏不起作用?

Android OS 2.2 权限:我完全不知道为啥这段简单的代码不起作用。我究竟做错了啥?

为啥这个简单的“INSERT INTO”查询不起作用