使用 UIHostingController 的 UIScrollView 跳转视图

Mar*_*kon 7 uiviewcontroller uikit autolayout

我想将 SwiftUI 视图放入UIScrollViewusing中UIHostingController。然而,即使我使用自动布局来约束视图,我的按钮“切换”似乎在动画期间在视图中跳跃。

下面的视频说明了动画时按钮文字跳转的问题

在此输入图像描述 导入 SwiftUI

struct ExpandableView: View {
    @State var expanded = false
    
    var body: some View {
        VStack {
            
            Button(action: { withAnimation {expanded.toggle() }}) {
                Text("toggle")
            }
            if expanded {
                Text("long text long text long text long text long text long text long text long text long text long text long textlong text long text long text long text long text long text long text long text long text long text long textlong text long text long text long text long text long text long text long text long text long text long text")
                    .font(.custom("x", fixedSize: 55))
            }
        }
    }
}


class ViewController: UIViewController {
    
    var scrollView: UIScrollView = {
        let sv = UIScrollView()
        sv.isDirectionalLockEnabled = true
        return sv
    }()
    
    var contentView: UIView = {
        let view = UIView()
        return view
    }()
    
    let controller = UIHostingController(rootView: ExpandableView())
    
    private var heightConstraint: NSLayoutConstraint?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        scrollView.frame = view.frame
        scrollView.contentSize = CGSize(width: view.bounds.size.width, height: view.bounds.size.height + 200)
        view.addSubview(scrollView)
        
        scrollView.addSubview(contentView)
        contentView.frame = scrollView.frame
        contentView.bounds = scrollView.bounds

        controller.view.backgroundColor = .yellow

        contentView.addSubview(controller.view)
        controller.view.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            controller.view.topAnchor.constraint(equalTo: contentView.safeAreaLayoutGuide.topAnchor),
            controller.view.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
            controller.view.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),
        ])
    }
    
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        
        scrollView.contentSize = CGSize(width: view.bounds.width, height: 100 + controller.view.intrinsicContentSize.height)
    }
}
Run Code Online (Sandbox Code Playgroud)