Va tenter de récupérer par la rupture de contrainte (mais je ne sais pas pourquoi mes contraintes sont mauvais)

0

La question

Je suis en train de faire une liste personnalisée de la cellule (collection de la liste d'affichage de la cellule), sur la base de cet article. J'ai ajouter manuellement la hauteur de la vue dans la cellule, mais je vois les avertissements ci-dessous dans la console de Xcode, et pas sûr de la partie à corriger.

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

Le code ci-dessous est là où je reçois ce message d'erreur.

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

Donc, pour clarifier où la LiveChannelContentView est, je viens de rajouter le jaune d'arrière-plan de la vue. Il ya deux choses que je ne comprends pas. Tout d'abord, même Xcode me dit que

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

quand je prends une capture d'écran de l'application et de mesurer l'arrière-plan jaune UIView de la hauteur, il est toujours 60. J'ai pensé à la rupture contrainte signifie que l'utilisation d'autres contraintes de hauteur au lieu de 60, mais est-ce mal?

Une autre chose est que j'étais curieux de savoir où l'

"<NSAutoresizingMaskLayoutConstraint:0x281209220 h=--& v=--& liveTest.LiveChannelContentView:0x128c13430.height == 44 (active)>" est utilisé dans mon code. J'ai cherché le fichier contient 44 dans mon espace de travail mais je n'ai rien eu.

Pas vraiment sûr, mais je pensais que la hauteur de 44 et 60 est appliqué à la même UIView et Xcode se débarrasser de la 60 de hauteur de l'ancrage ou de quelque chose. Cependant, quand je supprime la hauteur d'ancrage de la contentsView, contentsView.heightAnchor.constraint(equalToConstant: 60)l'application s'est écrasé comme ci-dessous.

enter image description here

J'ai aussi essayé de supprimer le haut ou le bas d'ancrage de la contentsView, mais il est aussi écrasé l'application.

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

ou

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

Si quelqu'un peut me dire quelle contrainte devrais-je résoudre à se débarrasser de la waring s'il vous plaît?

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

La meilleure réponse

1

Modifier cette partie

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

pour

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

Merci pour la réponse. Je l'ai essayé et cela a fonctionné maintenant. Si je suis correct, je pense que votre code soulève le bas de l'ancre de la priorité à résoudre le problème, ai-je le droit? Aussi, c'était ma première fois de résoudre ce problème, et comment le saviez-vous, nous avons besoin de soulever le bas de l'ancre de priorité? Pourriez-vous expliquer pour moi?
Yuuu

Il est diminué par défaut est de 1000 pour n'importe quelle contrainte initiale de la hauteur de la cellule est de 44 ans qui entre en conflit avec 60 dans votre contrainte qui tableview utilisé d'abord jusqu'à mise en page automatique calcule corriger la hauteur en fonction du contenu des cellules
Sh_Khan

Ah, maintenant je comprends pourquoi vous avez changé le bottomAnchor la priorité à 999. Aussi, je viens de googlé la cellule par défaut, la hauteur, qui est de 44, et j'ai compris pourquoi nécessité de réduire la priorité ainsi. Merci beaucoup!!
Yuuu

Dans d'autres langues

Cette page est dans d'autres langues

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