Vai tentar recuperar por quebra de restrição (mas não sei por que meu restrições estão errados)

0

Pergunta

Eu estou trabalhando na confecção de uma lista personalizada de célula (coleção a lista de exibição de célula), com base no presente artigo. Eu adicionar manualmente a altura de o ver na célula, mas eu vejo as advertências abaixo no console do Xcode, e não tem certeza de qual parte para corrigir.

[LayoutConstraints] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. 
translatesAutoresizingMaskIntoConstraints) 
    (
        "<NSAutoresizingMaskLayoutConstraint:0x281209220 h=--& v=--& liveTest.LiveChannelContentView:0x128c13430.height == 44   (active)>",
        "<NSLayoutConstraint:0x2812371b0 UIView:0x128c136b0.height == 60   (active)>",
        "<NSLayoutConstraint:0x2812372a0 V:|-(0)-[UIView:0x128c136b0]   (active, names: '|':liveTest.LiveChannelContentView:0x128c13430 )>",
        "<NSLayoutConstraint:0x2812372f0 UIView:0x128c136b0.bottom == liveTest.LiveChannelContentView:0x128c13430.bottom   (active)>"
    )
    
    Will attempt to recover by breaking constraint 
    <NSLayoutConstraint:0x2812371b0 UIView:0x128c136b0.height == 60   (active)>

O código abaixo é onde eu recebo esta mensagem de erro.

class LiveChannelContentView: UIView, UIContentView {
    
    let contentsView = UIView()
    
    lazy var titleLabel: UILabel = {
        let label = UILabel()
        label.text = ""
        return label
    }()
    
    lazy var statusLabel: UILabel = {
        let label = UILabel()
        label.text = ""
        return label
    }()
    
    lazy var symbolImageView: UIImageView = {
        let imageView = UIImageView()
        imageView.contentMode = .scaleAspectFit
        return imageView
    }()
    
    var liveEvent: LiveEvent?
    
    init(configuration: LiveChannelContentConfiguration) {
          // Custom initializer implementation here.
        super.init(frame: .zero)
        
        print("this is the view height: \(self.bounds.height)") // -> I get 0.0 in here
        setupAllViews()
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    func setupAllViews() {
        addSubview(contentsView)
        contentsView.addSubview(symbolImageView)
        contentsView.addSubview(indicator)
        contentsView.addSubview(titleLabel)
        contentsView.addSubview(statusLabel)

        contentsView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            contentsView.leadingAnchor.constraint(equalTo: layoutMarginsGuide.leadingAnchor),
            contentsView.trailingAnchor.constraint(equalTo: layoutMarginsGuide.trailingAnchor),
            contentsView.topAnchor.constraint(equalTo: layoutMarginsGuide.topAnchor),
            contentsView.bottomAnchor.constraint(equalTo: layoutMarginsGuide.bottomAnchor),
            contentsView.heightAnchor.constraint(equalToConstant: 60)
        ])
        
        contentsView.backgroundColor = .yellow
        
        symbolImageView.centerY(leading: contentsView.leadingAnchor, trailing: nil, parent: contentsView, paddingLeft: 0, paddingRight: 0, size: CGSize(width: 50, height: 50))
        indicator.centerY(leading: contentsView.leadingAnchor, trailing: nil, parent: contentsView, paddingLeft: 0, paddingRight: 0, size: CGSize(width: 50, height: 50))
        
        titleLabel.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            titleLabel.leadingAnchor.constraint(equalTo: symbolImageView.trailingAnchor, constant: 8),
            titleLabel.topAnchor.constraint(equalTo: symbolImageView.topAnchor),
            titleLabel.trailingAnchor.constraint(equalTo: contentsView.trailingAnchor)
        ])
        
        statusLabel.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            statusLabel.leadingAnchor.constraint(equalTo: titleLabel.leadingAnchor),
            statusLabel.topAnchor.constraint(equalTo: titleLabel.bottomAnchor),
            statusLabel.trailingAnchor.constraint(equalTo: titleLabel.trailingAnchor)
        ])
        
        print("this is the view after setup: \(self.bounds.height)") // I also get 0.0 in here
    }
}

enter image description here

Então, para esclarecer, onde o LiveChannelContentView é, eu só adicionar o plano de fundo amarelo para o visualizar. Há duas coisas que eu não entendo. Em primeiro lugar, mesmo Xcode me diz que

    Will attempt to recover by breaking constraint 
    <NSLayoutConstraint:0x2812371b0 UIView:0x128c136b0.height == 60   (active)>

quando eu tirar uma captura de tela do aplicativo e medir o plano de fundo amarelo a uiview altura, ainda é 60. Eu pensei que a quebra de restrição significa que a utilização de outras restrições de altura em vez de 60, mas isso é errado?

Outra coisa é que eu estava curioso para saber onde o

"<NSAutoresizingMaskLayoutConstraint:0x281209220 h=--& v=--& liveTest.LiveChannelContentView:0x128c13430.height == 44 (ativo)>" é usado no meu código. Eu procurei o arquivo contém 44 no meu espaço de trabalho, mas eu não recebi nada.

Realmente não tenho certeza, mas eu pensei que a altura de 44 e 60 é aplicada ao mesmo a uiview e Xcode, me livrar dos anos 60 altura âncora ou algo assim. No entanto, quando eu excluir a altura de âncora para a contentsView, contentsView.heightAnchor.constraint(equalToConstant: 60), o aplicativo travou, como abaixo.

enter image description here

Eu também tentou eliminar a parte superior ou inferior âncora do contentsView, mas também esmagado, o app.

contentsView.topAnchor.constraint(equalTo: layoutMarginsGuide.topAnchor),

ou

contentsView.bottomAnchor.constraint(equalTo: layoutMarginsGuide.bottomAnchor),

Então alguém pode me dizer qual a restrição deve corrigir para livrar-se do waring, por favor?

autolayout constraints ios swift
2021-11-21 10:30:34
1

Melhor resposta

1

Altere esta parte

    contentsView.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint.activate([
        contentsView.leadingAnchor.constraint(equalTo: layoutMarginsGuide.leadingAnchor),
        contentsView.trailingAnchor.constraint(equalTo: layoutMarginsGuide.trailingAnchor),
        contentsView.topAnchor.constraint(equalTo: layoutMarginsGuide.topAnchor),
        contentsView.bottomAnchor.constraint(equalTo: layoutMarginsGuide.bottomAnchor),
        contentsView.heightAnchor.constraint(equalToConstant: 60)
    ])

para

contentsView.translatesAutoresizingMaskIntoConstraints = false

let con = contentsView.bottomAnchor.constraint(equalTo: layoutMarginsGuide.bottomAnchor)
con.priority = UILayoutPriority(rawValue: 999)  
    NSLayoutConstraint.activate([
        contentsView.leadingAnchor.constraint(equalTo: layoutMarginsGuide.leadingAnchor),
        contentsView.trailingAnchor.constraint(equalTo: layoutMarginsGuide.trailingAnchor),
        contentsView.topAnchor.constraint(equalTo: layoutMarginsGuide.topAnchor),
        con,
        contentsView.heightAnchor.constraint(equalToConstant: 60)
    ])
2021-11-21 10:41:33

Obrigado pela resposta. Eu tentei e funcionou agora. Se eu estou correto, eu acho que o seu código levanta a fundo a âncora de prioridade para resolver o problema, estou certo? Também, foi minha primeira vez de resolver este problema, e como você sabia que nós precisamos levantar a âncora inferior a prioridade? Você poderia explicar isso para mim?
Yuuu

É reduzido conforme o padrão é 1000 para qualquer constrangimento criado , célula inicial altura é de 44 o que entra em conflito com 60 na sua restrição que tableview utilizado inicialmente até o layout automático calcula a altura correta de acordo com o conteúdo de uma célula
Sh_Khan

Ahh, agora eu entendo por que você mudou o bottomAnchor prioridade para o 999. Também, eu só pesquisei o padrão de altura da célula, que é de 44, e eu entendi o porquê da necessidade de diminuir a prioridade do bem. Muito obrigado!!
Yuuu

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................