Как сделать так, чтобы высота вида изменялась в Swift? - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть собственный класс UIView, где я создаю UIView и помещаю внутрь UILabel.Изначально я установил высоту UIView равной 60.0.Но как я могу сделать так, чтобы высота UIView изменялась с помощью UILabel?Например, если UILabel содержит 5 строк текста, высота UIView также увеличится до 200pt (например).

Вот мой класс: https://gist.github.com/orkhanalizade/747dc4fd1eb9f228ac964fb4048125dc

Я пробовал

self.translatesAutoresizingMaskIntoConstraints = false
self.heightAnchor.constraint(greaterThanOrEqualToConstant: 60.0).isActive = true
NSLayoutConstraint(item: self, attribute: .top, relatedBy: .equal, toItem: self, attribute: .top, multiplier: 1.0, constant: 60.0).isActive = true

но это мне не помогло Что я делаю не так и как я могу это исправить?

Ответы [ 3 ]

0 голосов
/ 24 ноября 2018

Просто вычислите высоту в соответствии с текстом и обновите ограничение высоты UIView с помощью метода UIView.animate ().

0 голосов
/ 27 ноября 2018

Пара примечаний ...

1) В общем случае представление не должно устанавливать свой собственный кадр.Что произойдет, если вы хотите добавить MyView в качестве подпредставления другого представления?Установка его фрейма, как у вас:

width: UIScreen.main.bounds.width - 16.0

не даст вам желаемых результатов.

2) Вам нужно не нужно:

self.addConstraints(constraints)

3) Я считаю полезным давать элементам разные, очевидные цвета фона - позволяет легко увидеть, что делают фреймы.

Вот отредактированная версия вашей сущности вместе с контроллером представления длядобавить / отобразить его:

import UIKit

class MyView: UIView {
    var label: UILabel!

    var text: String? {
        didSet {
            label.text = text
        }
    }

    var cornerRadius: CGFloat = 0.0 {
        didSet {
            self.layer.cornerRadius = self.cornerRadius
            self.layer.masksToBounds = true
        }
    }

    var textColor: UIColor = UIColor.black {
        didSet {
            label.textColor = textColor
        }
    }

    var isTextCentered: Bool = false {
        didSet {
            self.label.textAlignment = isTextCentered ? .center : .left
        }
    }

    init() {
        // we'll be using constraints, so no need to set a frame
        super.init(frame: CGRect.zero)
        initialize()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    fileprivate func initialize() {

        label = UILabel()
        label.translatesAutoresizingMaskIntoConstraints = false
        label.numberOfLines = 0

        self.addSubview(label)

        let constraints = [
            NSLayoutConstraint(item: label, attribute: .top, relatedBy: .equal, toItem: self, attribute: .top, multiplier: 1.0, constant: 8.0),
            NSLayoutConstraint(item: label, attribute: .leading, relatedBy: .equal, toItem: self, attribute: .leading, multiplier: 1.0, constant: 8.0),
            NSLayoutConstraint(item: label, attribute: .trailing, relatedBy: .equal, toItem: self, attribute: .trailing, multiplier: 1.0, constant: -8.0),
            NSLayoutConstraint(item: label, attribute: .bottom, relatedBy: .equal, toItem: self, attribute: .bottom, multiplier: 1.0, constant: -8.0)
        ]
        NSLayoutConstraint.activate(constraints)

        // so we can see self's frame
        self.backgroundColor = .red

        // so we can see label's frame
        label.backgroundColor = .yellow

    }
}

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // instantiate the custom view
        let v = MyView()

        // we'll be using constraints
        v.translatesAutoresizingMaskIntoConstraints = false

        // add the view
        view.addSubview(v)

        NSLayoutConstraint.activate([
            // constrain Top: 60 / Leading: 8 / Trailing: -8
            v.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 60.0),
            v.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 8.0),
            v.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -8.0),

            // constrain height >= 60
            v.heightAnchor.constraint(greaterThanOrEqualToConstant: 60.0),
            ])

        // add 10 lines of text
        v.text = (1...10).map({ "Line \($0)" }).joined(separator: "\n")

    }

}

И результат:

enter image description here

0 голосов
/ 24 ноября 2018

Поскольку вы изменяете размеры констант, вы можете использовать layoutIfNeeded().Это заставит обновить ограничения в представлении.Подробнее об этом можно прочитать в документации Apple .

...