【发布时间】:2020-09-01 15:47:29
【问题描述】:
当我添加一个包含 SwiftUI 视图的 UIHostingController 作为 childView,然后将该 childView 放在 UIScrollView 中时,滚动中断。
这里有我的看法
struct TestHeightView: View {
let color: UIColor
var body: some View {
VStack {
Text("THIS IS MY TEST")
.frame(height: 90)
}
.fixedSize(horizontal: false, vertical: true)
.background(Color(color))
.edgesIgnoringSafeArea(.all)
}
}
然后我有一个 UIViewController 和一个 UIScrollView 作为子视图。在 UIScrollView 内部有一个 UIStackView 正确设置为允许加载 UIViews 并在堆栈高度变得足够大时滚动它们。这行得通。如果我要加载 40 个 UILabel,它会完美地滚动它们。
当我添加一个普通的旧 UIView,然后在该容器中添加一个 UIHostingController 时,就会出现问题。我是这样做的:
let container = UIView()
container.backgroundColor = color.0
stackView.insertArrangedSubview(container, at: 0)
let test = TestHeightView(color: color.1)
let vc = UIHostingController(rootView: test)
vc.view.backgroundColor = .clear
add(child: vc, in: container)
func add(child: UIViewController, in container: UIView) {
addChild(child)
container.addSubview(child.view)
child.view.translatesAutoresizingMaskIntoConstraints = false
child.view.topAnchor.constraint(equalTo: container.topAnchor, constant: 0).isActive = true
child.view.bottomAnchor.constraint(equalTo: container.bottomAnchor, constant: 0).isActive = true
child.view.leadingAnchor.constraint(equalTo: container.leadingAnchor, constant: 0).isActive = true
child.view.trailingAnchor.constraint(equalTo: container.trailingAnchor, constant: 0).isActive = true
child.didMove(toParent: self)
}
在我的示例中,我添加了 3 个这些 containerViews/UIHostingController,然后添加了一个 UIView(绿色)来演示正在发生的事情。
您可以看到,当我滚动时,所有视图都被暂停,因为形成了一个间隙。正在发生的事情是包含 UIView(浅色)正在扩大其高度。一旦高度达到某个值,滚动将照常继续,直到下一个容器/UIHostingController 到达顶部并重新开始。
我研究过几种不同的解决方案 .edgesIgnoringSafeArea(.all)
做某事。我将它包含在我的示例中,因为没有它,问题完全一样,只是更加不和谐,更难用视频解释。基本上发生了同样的事情,但没有任何动画,只是看起来 UIScrollView 已经停止工作,然后它再次工作
编辑:
我添加了另一个 UIViewController 只是为了确保通常不是儿童导致问题。没有。只有 UIHostingControllers 这样做。 SwiftUI 中的一些东西
【问题讨论】:
-
你会准备可重现的例子吗?提供的代码快照不足以进行测试。
标签: swift uiscrollview swiftui