首页 > 解决方案 > SwiftUI:[未知进程名称] CGAffineTransformInvert:奇异矩阵错误

问题描述

预期:点击心形图标时会出现绿点加载动画

结果:什么都没有发生,感觉就像冻结了,因为心脏动画也不起作用

错误:[未知进程名称] CGAffineTransformInvert:奇异矩阵。

应用截图(非工作状态

代码

struct ContentView: View {
    @State private var count=0
     @State var isPressed = false
    @State var pressed = false
    @State var isLoading = false
    var body: some View {
       
        VStack {
            ZStack{
                Circle()
                    .fill( isPressed ? Color(.systemGray4) : .red )
                    .overlay(Image(systemName:"heart.fill")
                        .foregroundColor(isPressed ? .red :.white)
                        .font(.system(size:100))
                        
                        .scaleEffect( pressed ? 1.5 : 1.0)
                )
                .frame(width: 300, height: 300)
                
                
            }
            
            .onTapGesture{
                self.isLoading.toggle()
                withAnimation(.spring(response: 1,dampingFraction: 0.4, blendDuration :0.9)){
                self.isPressed.toggle()
                    self.pressed.toggle()
                    self.isLoading.toggle()
                }
                
            }
        
    
            HStack{
                ForEach(0...4, id: \.self){index in
                    Circle()
                        .frame(width:10,height:10)
                        .foregroundColor(.green)
                        .scaleEffect(self.isLoading ? 1:0)
                        .animation(Animation.linear(duration:0.6).repeatForever().delay(0.2*Double(index)))
                }
            }

        .padding()

            
    }
    
    }
    
}


struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

注意:当我不切换块内的isLoading状态变量onTapGesture()并在视图出现在onAppear()块内时直接将其设置为 true 时,加载动画有效

标签: iosswiftswiftui

解决方案


原因 :

问题基本上出在CGAffinTransform

当您对视图使用修饰符ScaleEffect时,编译器会在后台对您提供的比例值执行一些变换。

由于您为 .scaleEffect() 提供了值 0(零),因此它将大小设为零并将其视为奇异矩阵(它是一种行列式为零的矩阵)。并且它还被认为是对行列式为零的矩阵执行运算的数学违规。

解决方案 :

确保您使用的是 .scaleEffect() ,不要将视图缩放到精确的 0。您可以使用可能的最小值,即 0.1 或 0.01


推荐阅读