Intentará recuperar por la ruptura de la restricción (pero no sé por qué mis limitaciones están equivocados)

0

Pregunta

Estoy trabajando en hacer una lista personalizada de la célula (colección de la vista de lista de la célula), con base en este artículo. Puedo agregar manualmente la altura de la vista en el celular, pero yo veo las advertencias a continuación en la consola de Xcode, y no está seguro de qué parte de arreglar.

[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)>

El código de abajo es donde me sale este mensaje de error.

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

Así que, para aclarar que el LiveChannelContentView es, acabo de añadir el color amarillo de fondo a la vista. Hay dos cosas que no entiendo. En primer lugar, incluso Xcode me dice que

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

cuando me tome una captura de pantalla de la aplicación y medir el fondo amarillo UIView la altura, todavía es de 60. Pensé que romper restricción significa que el uso de otras restricciones de la altura en lugar de los 60, pero es que mal?

Otra cosa es que yo estaba curioso donde los

"<NSAutoresizingMaskLayoutConstraint:0x281209220 h=--& v=--& liveTest.LiveChannelContentView:0x128c13430.height == 44 (activo)>" se utiliza en mi código. He buscado el archivo que contiene 44 en mi área de trabajo, pero no tengo nada.

No sé, pero yo pensaba que la altura de 44 y 60 se aplica a la misma UIView y Xcode se deshizo de los años 60 la altura de anclaje o algo. Sin embargo, cuando elimino la altura de anclaje para el contentsView, contentsView.heightAnchor.constraint(equalToConstant: 60)la aplicación se estrelló, como el de abajo.

enter image description here

También he intentado eliminar la parte superior o la parte inferior de anclaje de la contentsView, pero también aplastó la aplicación.

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

o

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

Así que ¿alguien puede decirme que la restricción debo fijar para deshacerse de la waring, por favor?

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

Mejor respuesta

1

Cambiar 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)
    ])

a

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

Gracias por la respuesta. Yo lo probé y funcionó ahora. Si no me equivoco, creo que el código plantea la parte inferior del anclaje prioridad para solucionar el problema, estoy en lo cierto? También, era la primera vez que la solución de este problema, y cómo sabía usted que tenemos que elevar la parte inferior del anclaje de prioridad? Podría usted explicar esto para mí?
Yuuu

Es disminuyó a medida que el valor predeterminado es 1000 para cualquier restricción creada , celda inicial altura es de 44 en la que los conflictos con los 60 en la restricción que en formato tableview utilizado inicialmente hasta la disposición automática calcula la altura correcta de acuerdo con el contenido de una celda
Sh_Khan

Ahh, ahora tengo por qué ha cambiado el bottomAnchor prioridad de la 999. También, acabo de google el alto de celda predeterminado, que es de 44, y comprendí por qué la necesidad de bajar la prioridad. Muchas gracias!!
Yuuu

En otros idiomas

Esta página está en otros idiomas

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