Автоматический макет с просмотром текста внутри вида [Swift] - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь создать два вида внутри основного вида, и они автоматически меняются с помощью textView, я хочу добавить сначала один вид, а затем, нажав кнопку, добавить секунды, но у меня есть некоторые ошибки. Но я не хочу ставить равные ограничения по высоте для основного вида, он должен изменить размер в соответствии с текстовыми представлениями в своих 2 подпредставлениях. Вот фрагмент моего кода и изображение того, что я имею в виду:

        @objc func buttonAction() {
            print("action")

            mainView.addSubview(secondView)

            firstView.topAnchor.constraint(equalTo: mainView.topAnchor).isActive = false
            // I've tried to disable it to change the topAnchor of firstView 

            NSLayoutConstraint.activate([

                secondView.bottomAnchor.constraint(equalTo: firstView.topAnchor),
                secondView.leadingAnchor.constraint(equalTo: mainView.leadingAnchor),
                secondView.trailingAnchor.constraint(equalTo: mainView.trailingAnchor),
                secondView.topAnchor.constraint(equalTo: mainView.topAnchor)
            ])
        }

        func addConstraints() {

            NSLayoutConstraint.activate([

                firstView.topAnchor.constraint(equalTo: mainView.topAnchor),
                firstView.bottomAnchor.constraint(equalTo: mainView.bottomAnchor),
                firstView.leadingAnchor.constraint(equalTo: mainView.leadingAnchor),
                firstView.trailingAnchor.constraint(equalTo: mainView.trailingAnchor),
            ])

            NSLayoutConstraint.activate([
                mainView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
                mainView.centerXAnchor.constraint(equalTo: view.centerXAnchor)
            ])
        }

        class View1: UIView { // the same as View2 class

        lazy var textView: UITextView = {
           let tv = UITextView()
            tv.backgroundColor = .red
            tv.isScrollEnabled = false
            tv.font = UIFont(name: "Avenir", size: 16)
            tv.text = "First"
            tv.translatesAutoresizingMaskIntoConstraints = false
            return tv
        }()

        init() {
            super.init(frame: .zero)
            setup()
        }

        required init?(coder: NSCoder) {
            fatalError()
        }

        func setup() {
            addSubview(textView)

            textView.fillSuperview(padding: .init(top: 4, left: 4, bottom: 4, right: 4))
            // fillSuperview() put 4 in top,left,right,bottom of superview

        }
    }

Вот изображение того, что я имею в виду: enter image description here

1 Ответ

1 голос
/ 02 мая 2020

Вам нужно сохранить ссылку на ограничение top firstView и деактивировать эту ссылку. Вы пытались деактивировать новую ссылку на ограничение top firstView.

class ViewController: UIViewController {

    var firstViewTop: NSLayoutConstraint!

    func addConstraints() {

        firstViewTop = firstView.topAnchor.constraint(equalTo: mainView.topAnchor)
        NSLayoutConstraint.activate([
            firstViewTop,
            firstView.bottomAnchor.constraint(equalTo: mainView.bottomAnchor),
            firstView.leadingAnchor.constraint(equalTo: mainView.leadingAnchor),
            firstView.trailingAnchor.constraint(equalTo: mainView.trailingAnchor),
        ])

        NSLayoutConstraint.activate([
            mainView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
            mainView.centerXAnchor.constraint(equalTo: view.centerXAnchor)
        ])
    }

    @objc func buttonAction() {
        mainView.addSubview(secondView)
        firstViewTop.isActive = false

        NSLayoutConstraint.activate([
            secondView.bottomAnchor.constraint(equalTo: firstView.topAnchor),
            secondView.leadingAnchor.constraint(equalTo: mainView.leadingAnchor),
            secondView.trailingAnchor.constraint(equalTo: mainView.trailingAnchor),
            secondView.topAnchor.constraint(equalTo: mainView.topAnchor)
        ])
    }

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