我希望能够在SwiftUI中调整图像的大小和移动(就像是一张 map 一样),并通过收缩来zoom 和拖动图像.

使用UIKit,我将图像嵌入到了一个UIScrollView中,它处理了它,但我不知道如何在SwiftUI中实现它.

我已经搜索了一段时间了,有人知道有没有更简单的方法吗?

推荐答案

SwiftUI API在这里没有什么帮助:onChanged给出了当前zoom 手势开始的相关数字,并且在回调中没有明显的方法来获取初始值.还有一个统一的回调,但很容易错过/忘记.

A解决方法,添加:

@State var lastScaleValue: CGFloat = 1.0

然后在回调中:

.gesture(MagnificationGesture().onChanged { val in
            let delta = val / self.lastScaleValue
            self.lastScaleValue = val
            let newScale = self.scale * delta

//... anything else e.g. clamping the newScale
}.onEnded { val in
  // without this the next gesture will be broken
  self.lastScaleValue = 1.0
}

其中newScale是您自己的规模跟踪(可能是状态或绑定).如果你直接设置你的刻度,它会变得一团糟,因为在每一个刻度上,数值都会与之前的数值相对.

Swift相关问答推荐

运行异步任务串行运行

绑定到可选值的非可选属性?'

如何在SWIFT中轻松格式化公制和英制使用的UnitVolume

通过SwiftUI中的列表 Select 从字典中检索值

如何在SWIFT中使用DiscardingTaskGroup获得任务结果

从后台线程获取@发布属性的值(不更改它)是正确的吗?

SwiftUI同心圆,通过逐渐出现来显示进度

为什么要在SWIFT RandomAccessCollection协议中重新定义元素类型?

如何判断一个值是否为 Int 类型

iOS SwiftUI - 无法转换 ObservedObject 类型的值

Swift Swiftui - 将 colored颜色 保存到 UserDefaults 并从 @AppStorage 使用它

如何更改 Picker 的边框 colored颜色

`IndexSet` 永远不会是空的?

如何仅将 SwiftUI 不透明度应用于父视图?

VStack SwiftUI 中的动态内容高度

Swift 中惰性 var 的优势是什么

无法停止 AVPlayer

在 Swift 中子类化 NSObject - 初始化器的最佳实践

Swift 2.0 按属性对对象数组进行排序

如何将 Int 拆分为其各个数字?