SwiftUI图片捏合缩放异常:二次缩放重置为scale=1问题排查
SwiftUI图片捏合缩放异常修复
问题根源:你直接用progressingScale接收手势的value.magnitude,但MagnificationGesture的value每次新手势启动时都会从1开始计算,所以再次捏合时,progressingScale会被重置为1的倍数,导致图片先回到原始大小。
修复思路:拆分缩放状态为两个变量:
- 记录上次手势结束后的基础缩放比例
- 记录当前手势过程中的临时缩放倍数
最终的缩放效果是两者的乘积,这样新手势启动时,会基于上次的基础比例继续缩放。
修改后的代码:
@State private var baseScale: CGFloat = 1 @State private var currentScale: CGFloat = 1 var body: some View { Image(imageName) .resizable() .aspectRatio(contentMode: .fit) .padding([.leading, .trailing], 20) .scaleEffect(baseScale * currentScale) .gesture( MagnificationGesture() .onChanged { value in currentScale = value.magnitude } .onEnded { value in // 手势结束后,把临时缩放倍数合并到基础比例中 baseScale *= value.magnitude // 重置临时缩放倍数,为下一次手势做准备 currentScale = 1 } ) }
代码说明:
baseScale:保存每次手势结束后的最终缩放比例,作为下一次手势的基准currentScale:仅在手势过程中生效,记录当前手势相对于1的缩放倍数scaleEffect(baseScale * currentScale):实时计算当前的总缩放比例- 手势结束时,把本次的缩放倍数合并到
baseScale,然后重置currentScale为1,确保下一次手势从当前缩放状态开始
内容的提问来源于stack exchange,提问作者Duck
相关产品推荐
相关产品推荐

