期望:点击心形图标时出现绿点加载动画
结果:什么也没发生,感觉像是冻结了,因为心脏动画也不起作用
错误:[未知进程名称] 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
问题出在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)
归档时间: |
|
查看次数: |
1425 次 |
最近记录: |