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

Ary*_*yan 7 ios swift swiftui

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

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

错误:[未知进程名称] 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()
    }
}

Run Code Online (Sandbox Code Playgroud)

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

Deb*_*Das 12

原因 :

问题基本上出在CGAffinTransform

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

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

解决方案 :

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


Asp*_*eri 6

问题出在0规模效应上。

这是固定代码。使用 Xcode 11.4 / iOS 13.4 进行测试。还修正了以下情况的动画isLoading = false

演示

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

            HStack{
                ForEach(0...4, id: \.self){index in
                    Circle()
                        .frame(width:10,height:10)
                        .foregroundColor(.green)
                        .scaleEffect(self.isLoading ? 1:0.01)
                        .animation(self.isLoading ? Animation.linear(duration:0.6).repeatForever().delay(0.2*Double(index)) :
                            .default
                        )
                }
            }
            .padding()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)