SwiftUI将数据从UIViewRepresentable传递到SwiftUI';s观点

SwiftUI将数据从UIViewRepresentable传递到SwiftUI';s观点,swiftui,Swiftui,我正在编写一个自定义滚动视图,以启用图像缩放和定位。因为它将在SwiftUI视图中使用,所以我遵循UIViewRepresentable。我正在尝试获取滚动视图的zoomScale属性以及contentOffset,以便准确确定图像的外观(当前缩放和定位)。通常情况下,如果图像未缩放或位置不同,则该值将为1.0和(0,0) 我面临的问题是,如果我将绑定传递到视图中,而该视图在缩放比例更改或contentOffset更改时会更改,那么视图将被重新绘制(当backing@State刷新时)。这会导致

我正在编写一个自定义滚动视图,以启用图像缩放和定位。因为它将在SwiftUI视图中使用,所以我遵循
UIViewRepresentable
。我正在尝试获取滚动视图的
zoomScale
属性以及
contentOffset
,以便准确确定图像的外观(当前缩放和定位)。通常情况下,如果图像未缩放或位置不同,则该值将为1.0和(0,0)

我面临的问题是,如果我将绑定传递到视图中,而该视图在缩放比例更改或contentOffset更改时会更改,那么视图将被重新绘制(当backing@State刷新时)。这会导致“视图更新时更新状态”错误等问题

以及再次调用被重置为
makeUIView
的contentOffset和缩放比例。如果我也重用那里的值,我们几乎会进入一个事件循环

Scale changes->Binding changes->State changes->Redraw UI->Scale changes…

当SwiftUI中的数据发生更改时,是否有任何方法可以在不刷新视图的情况下将数据传递出视图?ViewPreferences呢?他们能工作吗

另一个问题发生在“superview”中任何其他不相关的@State更改时,scale和contentOffset被重置,因此我需要向该视图传递一个绑定


谢谢

我找到的一种方法是在协调器中添加一个“shouldUpdateEstate”布尔值

当比例更改时,将shouldUpdateEstate设置为false

然后设置绑定

updateUIView方法的第一行应该是

guard context.coordinator.shouldUpdateState else {
    context.coordinator.shouldUpdateState = true
    return
}
这是一个有点老套的解决方案。。。不幸的是,似乎没有任何好的管理方法

另一种可能有效的替代方法(我没有测试过)是使用这样一个可观察的对象

class ViewModel: ObservableObject {
    @Published var zoomScale: CGFloat
}
在你的UIViewRepresentable中

// Note we aren't using @ObservedObject here. 
// It shouldn't trigger view reloads when you update your viewModel. 
// But it will still trigger them in your swiftUI views.
var viewModel: ObservableObject<ViewModel>

init(viewModel: ObservableObject<ViewModel>) {
    self._viewModel = viewModel
}
//注意,这里没有使用@ObservedObject。
//更新viewModel时,它不应触发视图重新加载。
//但它仍然会在您的swiftUI视图中触发它们。
var视图模型:可观察对象
初始化(视图模型:ObserveObject){
self.\u viewModel=viewModel
}

听起来您的代码中有bug,因为当representable的绑定发生更改时,不应调用
makeUIView
,而只调用
updateUIView
,所以您会提供您的代码吗?