Размер пользовательских созданных видов не меняется в зависимости от ограничений - PullRequest
0 голосов
/ 28 января 2019

Я создал собственный вид, который должен быть встроен в разные места.

Вот что я сделал вместе с кодом:

1) Создал файл Swift и файл xib с именем CustomLabel.Содержимое CustomLabel.swift:

import UIKit

class CustomLabel: UIView {

@IBOutlet var view: UIView!
@IBOutlet weak var label: UILabel!

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    print("CustomLabel")
    Bundle.main.loadNibNamed("CustomLabel", owner: self, options: nil)


    self.addSubview(self.view)
}



}

Вот как выглядит CustomLabel.xib:

I have made the size

Я сделал вид свободной формыи установите его высоту.Я добавил вид метки внутри него с ограничениями со всех четырех сторон.

Теперь я добавляю это представление в свой основной ViewController, но устанавливаю ширину этого представления больше, чем исходное многоразовое представление.

Это результат:

enter image description here

Желтый фон показывает дополнительную ширину вида, а черный - исходный вид.,

Как сделать так, чтобы повторно используемый вид растягивался, чтобы охватить весь вид?

1 Ответ

0 голосов
/ 28 января 2019

То, как вы загружаете XIB, создает два UIView объектов, где вы можете подумать, что он создает только один.

Вы можете легко увидеть этоиспользование Debug View Hierarchy

Здесь синий вид - это вид, добавленный в раскадровку, с нормально установленными ограничениями (в данном случае 40 пунктов с каждой стороны, высота 100 и по центру по вертикали).

Красный вид - это вид, с которым вы работаете при разработке XIB, и он имеет метку с черным фоном, ограниченную 0 со всех четырех сторон.

enter image description here

Ваш XIB класс равен UIView - так что это его собственный вид ... Когда вы добавили UIView к вашей раскадровке и установили егокласс до CustomLabel, который становится «корневым» представлением.В своем коде вы добавляете view в качестве подпредставления ... которое должно дать вам подсказку, что у вас есть два UIView объекта.

Теперь произошло то, что CustomLabel (то есть UIView) использует ограничения, которые вы установили в раскадровке, но в подпредставлении view не установлены ограничения.

Если вы измените свой код загрузки на этот (я изменил ваши IBOutlet имена, потому что добавление «представления» в качестве подпредставления к другому «представлению» может привести к путанице):

class CustomLabel: UIView {

    @IBOutlet var theView: UIView!
    @IBOutlet weak var thelabel: UILabel!

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        print("CustomLabel")
        Bundle.main.loadNibNamed("CustomLabel", owner: self, options: nil)

        self.addSubview(self.theView)

        self.theView.translatesAutoresizingMaskIntoConstraints = false

        NSLayoutConstraint.activate([
            self.theView.topAnchor.constraint(equalTo: self.topAnchor, constant: 0.0),
            self.theView.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: 0.0),
            self.theView.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 0.0),
            self.theView.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: 0.0),
            ])

    }

}

Теперь ваш код загружаетсяпредставление из XIB добавляет его в качестве подпредставления CustomLabel (которое, опять же, само по себе UIView) и устанавливает ограничения, как и следовало ожидать, давая такой результат:

enter image description here

Как вы можете видеть, theView, который был добавлен как подпредставление (красный на этом изображении), теперь ограничен своим суперпредставлением - синий CustomLabel.

...