SwiftUI卡片滑动转场异常:仅首次滑动生效问题求助
问题原因与解决方案
你的问题核心在于视图的存在状态没有发生变化:
第一次点击按钮时,dealtCard从false切换到true,SwiftUI会插入Image视图,这时候.slide转场会正常触发。但后续点击按钮时,dealtCard始终保持true,只是更新了cardDealt的图片名称——此时Image视图只是修改了显示内容,并没有被重新插入或移除,所以转场动画不会再次执行。
解决方法一(推荐):用id强制重建视图
给Image添加.id(cardDealt),让SwiftUI认为每次卡片变化都是一个全新的视图,从而触发转场:
Image(cardDealt) .resizable() .cornerRadius(15) .aspectRatio(contentMode: .fill) .transition(.slide) .id(cardDealt) // 新增这行代码
解决方法二:手动控制视图的移除与插入
修改deal方法,先让旧卡片移除,再插入新卡片:
func deal() { // 先隐藏当前卡片 withAnimation { dealtCard = false } // 等待转场完成后,更新卡片并显示 DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { let cpuCardValue = Int.random(in:1...50) cardDealt = "card" + String(cpuCardValue) withAnimation { dealtCard = true } } }
注:延迟时间0.3可以根据实际转场动画时长调整,确保旧卡片完全消失后再显示新卡片。
内容的提问来源于stack exchange,提问作者user13470314
相关产品推荐
相关产品推荐

