首页 > 解决方案 > 带有自动布局的 uiscrollview 的动态内容未按预期工作

问题描述

我正在尝试将动态内容添加到滚动视图,如下所示

 for i in 0 ..< 4 {
            let gameView = Card.instantiate()
            gameView.frame.origin.y  =  gameView.frame.size.height * CGFloat(i)
            contentView.addSubview(gameView)
            gameView.centerXAnchor.constraint(equalTo: contentView.centerXAnchor).isActive = true
            let widthConstraint = NSLayoutConstraint(item: gameView, attribute: .width, relatedBy: .equal,toItem: contentView, attribute: .width, multiplier: 0.8,constant : 0.0)

         contentView.addConstraint(widthConstraint)

         let heightConstraint = NSLayoutConstraint(item: gameView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .height, multiplier: 1.0, constant: 100)

         gameView.addConstraint(heightConstraint)


         contentView.frame.size.height = contentView.frame.size.height + gameView.frame.size.height

         scrollView.contentSize.height = scrollView.contentSize.height + gameView.frame.size.height
        }

Cardview 使用自动布局定义 xib 在此处输入图像描述

并在 IB 中查看结构如下 SuperView > ScrollView > ContentView > DynamicViews

ContentView 还包含一些静态内容,如按钮和标签。动态视图低于静态内容

在此处输入图像描述

输出屏幕如下所示,但未正确对齐在此处输入图像描述

这是将动态视图添加到滚动视图的正确方法吗?

标签: swiftuiviewuiscrollview

解决方案


这是一个理想的案例UIStackView

堆栈视图将处理实例化gameViews 的垂直定位和宽度(假设您的 xib 加载设置正确)。

通过将堆栈视图的顶部、前导、尾随、底部和宽度约束到滚动视图,它还将定义“可滚动区域”(the .contentSize)。

全部通过自动布局完成:

    let sv = UIStackView()
    sv.axis = .vertical
    sv.alignment = .fill
    sv.distribution = .fill
    sv.spacing = 0  // change to add vertical spacing if desired
    sv.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(sv)
    NSLayoutConstraint.activate([
        sv.topAnchor.constraint(equalTo: scrollView.topAnchor),
        sv.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor),
        sv.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor),
        sv.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor),
        sv.widthAnchor.constraint(equalTo: scrollView.widthAnchor, multiplier: 1.0),
        ])
    for _ in 0 ..< 4 {
        let gameView = Card.instantiate()
        gameView.translatesAutoresizingMaskIntoConstraints = false
        gameView.heightAnchor.constraint(equalToConstant: 100.0).isActive = true
        sv.addArrangedSubview(gameView)
    }

推荐阅读