首页 > 解决方案 > 使用 UIHostingController 的 UIScrollView 跳跃视图

问题描述

我想将 SwiftUI 视图放入UIScrollView使用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)
    }
}

标签: uiviewcontrollerautolayoutuikit

解决方案


推荐阅读