【问题标题】:Why can't I see UIStackView in UIScrollView?为什么在 UIScrollView 中看不到 UIStackView?
【发布时间】:2019-04-05 19:05:51
【问题描述】:

我将把 UIStackView 放在 UIScrollView 中。为了方便起见,我将制作一张思维导图。我放入 UIScrollView 的 UIStackView 是思维导图的对象。这样,嵌入的 UIStackView 就会出现在 UIScrollView 的所有区域中。

但是,虽然我已经为 UIScrollView 指定了 UIStackView 的位置,但 UIStackView 并没有出现在 UIScrollView 中。

我的界面构建器(附加界面构建器图像以了解我的视图层次结构。):

import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var scrollView: UIScrollView!
    @IBOutlet weak var createObject: UIBarButtonItem!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        let redView = UIView()
        redView.backgroundColor = .red

        let blueView = UIView()
        blueView.backgroundColor = .blue

        let stackView = UIStackView(arrangedSubviews: [redView, blueView])
        stackView.axis = .vertical
        stackView.distribution = .fillEqually

        stackView.center = scrollView.center

        scrollView.addSubview(stackView)
    }
}

【问题讨论】:

  • 您的图像显示您遇到了约束错误。显示这些错误。
  • @DonMag 您好,感谢您的评论。我向您展示的图像是为了了解我的界面构建器中的视图层次结构。界面生成器或我的代码没有错误。

标签: ios swift uiscrollview uistackview


【解决方案1】:

UIViewUIStackView 都没有内在大小。

因此,您最终会在滚动视图中添加一个大小为 0, 0 的堆栈视图,其中包含两个视图,每个视图的大小为 0, 0

您需要在某处应用一些尺寸。

这将为您提供与滚动视图等宽、两倍高的堆栈视图(因此您有一个“全高”蓝色视图和一个“全高”红色视图):

class ViewController: UIViewController {

    @IBOutlet weak var scrollView: UIScrollView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        let redView = UIView()
        redView.backgroundColor = .red

        let blueView = UIView()
        blueView.backgroundColor = .blue

        let stackView = UIStackView(arrangedSubviews: [redView, blueView])
        stackView.axis = .vertical
        stackView.distribution = .fillEqually

        scrollView.addSubview(stackView)

        stackView.translatesAutoresizingMaskIntoConstraints = false

        NSLayoutConstraint.activate([
            stackView.topAnchor.constraint(equalTo: scrollView.topAnchor, constant: 0.0),
            stackView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor, constant: 0.0),
            stackView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor, constant: 0.0),
            stackView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor, constant: 0.0),

            stackView.widthAnchor.constraint(equalTo: scrollView.widthAnchor, constant: 0.0),
            stackView.heightAnchor.constraint(equalTo: scrollView.heightAnchor, multiplier: 2.0),
            ])

    }
}

编辑:

这是另一个例子。它添加了 6 个子视图,具有指定的宽度和高度。堆栈视图属性更改为:

.alignment = .center
.distribution = .fill
.spacing = 8

结果:

并向下滚动:

和代码:

class ViewController: UIViewController {

    @IBOutlet weak var scrollView: UIScrollView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let colors: [UIColor] = [
            .red,
            .blue,
            .green,
            .orange,
            .yellow,
            .cyan,
        ]

        let sizes: [CGSize] = [
            CGSize(width: 100, height: 150),
            CGSize(width: 250, height: 100),
            CGSize(width: 200, height: 120),
            CGSize(width: 160, height: 200),
            CGSize(width: 220, height: 180),
            CGSize(width:  60, height:  80),
        ]

        let stackView = UIStackView()
        stackView.axis = .vertical
        stackView.distribution = .fill
        stackView.alignment = .center
        stackView.spacing = 8

        for (color, size) in zip(colors, sizes) {
            let v = UIView()
            v.translatesAutoresizingMaskIntoConstraints = false
            v.widthAnchor.constraint(equalToConstant: size.width).isActive = true
            v.heightAnchor.constraint(equalToConstant: size.height).isActive = true
            v.backgroundColor = color
            stackView.addArrangedSubview(v)
        }

        scrollView.addSubview(stackView)

        stackView.translatesAutoresizingMaskIntoConstraints = false

        NSLayoutConstraint.activate([
            stackView.topAnchor.constraint(equalTo: scrollView.topAnchor, constant: 0.0),
            stackView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor, constant: 0.0),
            stackView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor, constant: 0.0),
            stackView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor, constant: 0.0),

            stackView.widthAnchor.constraint(equalTo: scrollView.widthAnchor, constant: 0.0),

            // do NOT set a heightAnchor ... let the subviews define the height
//          stackView.heightAnchor.constraint(equalTo: scrollView.heightAnchor, multiplier: 2.0),
            ])

    }
}

【讨论】:

  • 感谢您的真诚回复。我可以再问你几个问题吗?当前的 UIStackView 填充了 ScrollView 屏幕。但我不想把它填满,我希望它像一个修改过的问题的图像。我可以指定 UIStackView 的帧大小吗?
  • 而且我不想根据 UIStackView 帧大小来改变内部 Views 的大小比例。我希望所有的视图都有自己的大小,如下面链接所附的图片所示。 link
  • 您可以应用您想要的任何尺寸。但是,您的图像似乎显示了 水平 排列,而您的问题为堆栈视图的 .axis 指定了 .vertical
  • 如果您说的是我刚刚发送给您的 [链接],这只是每个排列的子视图大小的示例。你的垂直排列是正确的。你碰巧知道如何指定我想要的尺寸吗?
  • 首先,我要调整 UIStackView 的大小。
【解决方案2】:

您尚未将 frame 设置为 stackview。尝试添加

stackView.frame = UIScreen.main.bounds

addSubview 之后。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    相关资源
    最近更新 更多