Программно добавляем представление в StackView, ничего не делая - PullRequest
0 голосов
/ 06 июля 2018

У меня есть два вертикальных представления стека, одно вложено в другое следующим образом:

StackView #1
   UITextField
   StackView #2 (nothing in this one)
   UIButton  

Я пытаюсь программно вставить UITextFields в мой StackView # 2, но когда я это делаю, ничего не происходит. Я не вижу вставляемого представления и на экране ничего не происходит.

StackView # 1 настроен на выравнивание заполнения, распределение распределения пропорционально. И мой StackView # 2 - оба Fill.

Я не получаю предупреждения об ограничениях, когда пытаюсь добавить в StackView # 2, поэтому мне любопытно, почему ничего не происходит. Вот как я добавляю:

let textField = UITextField(frame: CGRect(x: 0, y: 0, width: 285, height: 30))
textField.placeholder = "Name"
subtasksStackView.addArrangedSubview(textField)

1 Ответ

0 голосов
/ 06 июля 2018

Вот код, который вы можете добавить на игровую площадку. Он содержит ту же структуру, что и структура в вашем вопросе, но есть небольшая разница; Я также использую третье представление стека, которое просто используется, чтобы обернуть все, чтобы я мог поместить содержимое в верхнюю часть контроллера представления без какого-либо нежелательного изменения размера (растяжения, сжатия) содержащихся элементов. Я подозреваю, что это может быть проблема с ограничением, но это должно помочь вам сравнить вашу текущую реализацию с рабочим решением.

import UIKit
import PlaygroundSupport


class ViewController: UIViewController {

    // MARK: - Properties

    let mainStackView = UIStackView()
    let stackViewOne = UIStackView()
    let textFieldOne = UITextField()
    let stackViewTwo = UIStackView()
    let buttonOne = UIButton(type: .system)

    // MARK: - Lifecycle

    override func viewDidLoad() {
        view.backgroundColor = .white
        // mainStackView is used so that the UI elements can be displayed at the top of the stack view without being stretched to fill the entire view controller.
        mainStackView.axis = .horizontal
        mainStackView.alignment = .top
        mainStackView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(mainStackView)
        // mainStackView needs constraints to the view controller's view.
        mainStackView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
        mainStackView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        mainStackView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
        mainStackView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
        // Configure the first stack view. This is StavkView#1, in your case.
        stackViewOne.axis = .vertical
        stackViewOne.alignment = .fill
        stackViewOne.distribution = .fillProportionally
        mainStackView.addArrangedSubview(stackViewOne)
        // Configure the first text field.
        textFieldOne.heightAnchor.constraint(equalToConstant: 30).isActive = true
        textFieldOne.placeholder = "Text Field One"
        textFieldOne.borderStyle = .line
        stackViewOne.addArrangedSubview(textFieldOne)
        stackViewOne.addArrangedSubview(stackViewTwo)
        // Configure the button.
        buttonOne.heightAnchor.constraint(equalToConstant: 44).isActive = true
        buttonOne.setTitle("Button", for: .normal)
        buttonOne.tintColor = .black
        stackViewOne.addArrangedSubview(buttonOne)
        // Add the second text field to the nested stack view. This is StackView#2, in your case.
        let textFieldTwo = UITextField(frame: CGRect(x: 0, y: 0, width: 285, height: 30))
        textFieldTwo.heightAnchor.constraint(equalToConstant: 30).isActive = true
        textFieldTwo.placeholder = "Name"
        textFieldTwo.borderStyle = .line
        stackViewTwo.addArrangedSubview(textFieldTwo)
    }

}

let viewController = ViewController(nibName: nil, bundle: nil)
viewController.view.frame = CGRect(x: 0, y: 0, width: 1000, height: 1000)

PlaygroundPage.current.liveView = viewController
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...