UIView внутренние ограничения - PullRequest
0 голосов
/ 26 февраля 2019

Я создал простой UIView, который содержит красное поле (UIImage) в его центре.Когда все ограничения являются константами, код работает нормально.Однако, если я заменим ограничение по высоте на то, которое делает поле равным половине высоты вида, то поле исчезает.

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

Как установить ограничение высоты redBox, чтобы оно всегда составляло половину высоты BoxView?

import UIKit

class BoxView: UIView {

    public var redBox: UIImageView

    public override init(frame: CGRect) {
        redBox = UIImageView(frame: .zero)
        redBox.backgroundColor = .red

        super.init(frame: frame)
        self.backgroundColor = .yellow

        addSubview(redBox)
        redBox.translatesAutoresizingMaskIntoConstraints = false
        let margins = layoutMarginsGuide
        redBox.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
        redBox.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
        redBox.widthAnchor.constraint(equalToConstant: 100).isActive = true
      //redBox.heightAnchor.constraint(equalToConstant: 100).isActive = true
        redBox.heightAnchor.constraint(equalTo: self.heightAnchor, constant: 0.5)
    }

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

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        view = BoxView()
    }
}

1 Ответ

0 голосов
/ 26 февраля 2019

Замените

redBox.heightAnchor.constraint(equalTo: self.heightAnchor, constant: 0.5)

на

redBox.heightAnchor.constraint(equalTo: self.heightAnchor, multiplier: 0.5).isActive = true

NSLayoutConstraint.activate([
    redBox.centerXAnchor.constraint(equalTo: self.centerXAnchor),
    redBox.centerYAnchor.constraint(equalTo: self.centerYAnchor),
    redBox.widthAnchor.constraint(equalToConstant: 100),
    redBox.heightAnchor.constraint(equalTo: self.heightAnchor, multiplier: 0.5)
])

Сначала в вашем текущем коде вы пропускаете .isActive = true, который имеет такой же эффект, как если бы строка нене существует, и если указано, это сделает высоту окна равной высоте вида + константе (= 0,5)

высота ящика = высота вида * множитель + константа

а так как множитель по умолчанию = 1 и вы установите константу = 0,5, это будет

высота поля = высота просмотра * 1,0 + 0,5

Но вместо этого вам нужно

высота поля = высота просмотра * 0,5 + 0 // опустить параметр consatnt в ограничении, и он будет равен нулю


class BoxView: UIView { 
    public var redBox: UIImageView
    public override init(frame: CGRect) {
        super.init(frame: frame)
        redBox = UIImageView(frame: .zero)
        redBox.backgroundColor = .red
        self.backgroundColor = .yellow
        addSubview(redBox)
        redBox.translatesAutoresizingMaskIntoConstraints = false
        let margins = layoutMarginsGuide

        NSLayoutConstraint.activate([
            redBox.centerXAnchor.constraint(equalTo: self.centerXAnchor),
            redBox.centerYAnchor.constraint(equalTo: self.centerYAnchor),
            redBox.widthAnchor.constraint(equalToConstant: 100),
            redBox.heightAnchor.constraint(equalTo: self.heightAnchor, multiplier: 0.5)
        ])
    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
...