【问题标题】:SwiftUI : [Unknown process name] CGAffineTransformInvert: singular matrix ERRORSwiftUI:[未知进程名称] CGAffineTransformInvert:奇异矩阵错误
【发布时间】:2020-08-28 08:23:27
【问题描述】:

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

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

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

Screenshot of the app(not working state)

代码

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

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

【问题讨论】:

    标签: ios swift swiftui


    【解决方案1】:

    原因:

    问题基本上出在CGAffinTransform

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

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

    解决方案:

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

    【讨论】:

    • 如果你需要一个非常小的非零值,你可以使用CGFloat.ulpOfOne
    【解决方案2】:

    问题出在0scaleEffect。

    这里是固定代码。使用 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()
            }
        }
    }
    

    【讨论】:

    • 感谢您的解决方案,您能告诉我发生这种情况的原因以及将来如何防止这种情况发生吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多