Почему я не вижу UIStackView в UIScrollView? - PullRequest
0 голосов
/ 05 апреля 2019

Я собираюсь поместить UIStackView в UIScrollView.Проще говоря, я собираюсь составить карту ума.UIStackView, который я поместил в UIScrollView, является объектом карты разума.Таким образом, встроенный UIStackView появится во всех зонах UIScrollView.

Однако, хотя я указал местоположение UIStackView для UIScrollView, UIStackView не отображается в UIScrollView.

Мой интерфейсbuilder (Присоединяет образ создателя интерфейса для понимания иерархии My View.):

enter image description here

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)
    }
}

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019

Вы не установили фрейм в стек просмотра. Попробуйте добавить

stackView.frame = UIScreen.main.bounds

после addSubview.

0 голосов
/ 05 апреля 2019

Ни UIView, ни UIStackView не имеют внутренних размеров.

Таким образом, вы добавляете представление стека размером 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),
            ])

    }
}

Edit:

Вот еще один пример. Он добавляет 6 подпредставлений, с указанием ширины и высоты. Свойства представления стека изменены на:

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

Результат:

enter image description here

и прокрутите вниз:

enter image description here

и код:

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),
            ])

    }
}
...