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