繁体   English   中英

UIScrollView内部的动态UIStackView

[英]dynamic UIStackView inside of UIScrollView

由于自iOS7以来进行了广泛的更新,由于我对自动布局和新的stackview的经验有限,我想问这个问题,我想知道在Objective-C中实现以下目标的最佳设计实践是什么(尚不迅速):

在此处输入图片说明

在我看来,有一个容器滚动视图和一个子容器UIView。 在此UIView中,有许多元素。 元素之一是一堆UIView,其数量有时会有所不同。

该元素后面是地图和其他视图。

这是我计划的组织方式: 在此处输入图片说明

问题

  1. 这是正确的做法吗? 以编程方式删除和添加元素时,如何修改stackview的高度限制?
  2. 如何通过接口构建器将子视图添加到UIStackView? 当我这样做时,子视图采用包含的stackview的大小。

因此,您可能需要使整个布局包含在stackview中。 只是要考虑的事情。

  1. 确实没有正确的做事方法。 我不会在您的UIStackView上设置高度限制(一定要添加一个等于视图宽度的宽度限制)。 仅在添加到堆栈视图的元素上进行设置。 您将得到一个错误,但这只是IB的抱怨,直到您向UIStackView中添加了一个元素。

要调整堆栈视图中元素的大小,必须在它们上设置水平约束。 然后,您可以在代码中修改单个水平约束以更改对象的高度。

  1. 要添加子视图,您只需执行以下操作:

    stackView.addArrangedSubview(childVC.view)

或在界面生成器中,您只需将元素拖到堆栈视图中即可。 确保它具有水平约束,否则将根据您的大小进行调整。

斯威夫特4.2

如果您想使用代码而不是故事板,我将使用自动布局创建一个示例,该示例无需估计内容的大小。

您只需要添加到堆栈视图或从堆栈视图中删除,然后滚动高度会自动修改。

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        view.addSubview(scrollView)
        scrollView.addSubview(scrollViewContainer)
        scrollViewContainer.addArrangedSubview(redView)
        scrollViewContainer.addArrangedSubview(blueView)
        scrollViewContainer.addArrangedSubview(greenView)

        scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
        scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
        scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true

        scrollViewContainer.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
        scrollViewContainer.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor).isActive = true
        scrollViewContainer.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
        scrollViewContainer.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
        // this is important for scrolling
        scrollViewContainer.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true
    }

    let scrollView: UIScrollView = {
        let scrollView = UIScrollView()

        scrollView.translatesAutoresizingMaskIntoConstraints = false
        return scrollView
    }()

    let scrollViewContainer: UIStackView = {
        let view = UIStackView()

        view.axis = .vertical
        view.spacing = 10

        view.translatesAutoresizingMaskIntoConstraints = false
        return view
    }()

    let redView: UIView = {
        let view = UIView()
        view.heightAnchor.constraint(equalToConstant: 500).isActive = true
        view.backgroundColor = .red
        return view
    }()

    let blueView: UIView = {
        let view = UIView()
        view.heightAnchor.constraint(equalToConstant: 200).isActive = true
        view.backgroundColor = .blue
        return view
    }()

    let greenView: UIView = {
        let view = UIView()
        view.heightAnchor.constraint(equalToConstant: 1200).isActive = true
        view.backgroundColor = .green
        return view
    }()
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM