我尝试使用UIViewRepresentable实现一个延迟加载的MyLazyHStack视图,但是它没有延迟加载元素。我在MyLazyHStack的内容中使用LazyHStack,但是所有元素都是一次加载的,而不是根据需要延迟加载。这里是我的代码的一个最小示例。有人能帮助我找出我做错了什么吗?
struct MyLazyHStack<Content: View>: UIViewRepresentable {
var content: Content
func makeUIView(context: Context) -> UIView {
let scrollView = UIScrollView()
scrollView.isPagingEnabled = true
let hostingController = UIHostingController(rootView: content)
hostingController.view.translatesAutoresizingMaskIntoConstraints = false
scrollView.addSubview(hostingController.view)
NSLayoutConstraint.activate([
hostingController.view.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor),
hostingController.view.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor),
hostingController.view.topAnchor.constraint(equalTo: scrollView.topAnchor),
hostingController.view.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor),
hostingController.view.heightAnchor.constraint(equalTo: scrollView.heightAnchor)
])
return scrollView
}
func updateUIView(_ uiView: UIView, context: Context) {}
}
struct ContentView: View {
var body: some View {
MyLazyHStack {
LazyHStack {
ForEach(1..<100) { index in
Text("Element \(index)")
}
}
}
}
}
1条答案
按热度按时间taor4pac1#
要使用UIViewRepresentable实现延迟加载MyLazyHStack视图,需要对代码进行一些更改。
1.将contentSize变量添加到UIViewRepresentable结构中以跟踪内容的大小。
1.实现UIScrollViewDelegate协议的scrollViewDidScroll方法,以检测用户何时滚动到可见区域的末尾。
1.更新UIViewRepresentable结构的updateUIView方法,以计算内容的可见区域,并仅加载可见区域内的元素。
对原始代码的更改:
1.添加contentSize变量以跟踪内容的大小。
1.将UIScrollView的委托设置为Coordinator对象,以便在用户滚动时调用scrollViewDidScroll方法。
1.更新updateUIView方法以计算内容的可见区域,并仅加载可见区域内的元素。
1.添加一个符合UIScrollViewDelegate协议并实现scrollViewDidScroll方法的Coordinator类。该方法在用户滚动时更新超级视图的布局。