Rilevato un caso in cui i vincoli suggeriscono ambiguamente un'altezza pari a zero


120

Dopo l'aggiornamento a Xcode 6.1 beta 2 quando eseguo la mia app che contiene celle tableview, l'assistente di debug dice:

Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.

Prima, quando usavo Xcode 5 su questo progetto, ricevevo alcuni errori ma quelli sono andati via da quando ho aggiornato. Non ho altri errori o avvisi ora. Ho già provato a regolare le dimensioni di tutte le celle tableview e ho anche provato a utilizzare l'altezza standard, ma ricevo ancora lo stesso avviso:

Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.

Ho anche letto tutti gli argomenti simili su questo, ma nessuna delle loro soluzioni aiuta. Quando provo l'app con il simulatore, l'app funziona correttamente tranne che le immagini che dovrebbero essere nelle celle tableView non ci sono.


2
Ricevo lo stesso errore per la cella di visualizzazione raccolta. Quello che faccio per questo. Eventuali suggerimenti.
Python

Forse si dovrebbe verificare se hai già aggiunto il file XI ter del target stackoverflow.com/a/26870331/1418457
onmyway133


Mi è successo su iOS 8.1, ma non più su iOS 8.4. Se hai specificato l'altezza, immagino che sia solo un bug di Xcode.
samwize

Risposte:


126

Finora tre cose sono riuscite a mettere a tacere questo avvertimento. Puoi ritirare il più conveniente per te. Niente di carino però.

  • Per impostare l'altezza predefinita della cella in viewDidLoad

    self.tableView.rowHeight = 44;
  • Vai allo storyboard e modifica l'altezza della riga sulla visualizzazione della tabella in qualcosa di diverso da 44.

  • Per implementare il metodo delegato di tableview heightForRowAtIndexPath

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return 44;
    }

Strano.


Ho anche provato a utilizzare il tuo metodo ma ho bisogno di aggiungere un @property per rowHeight ma non conosco il tipo di oggetto corretto da usare
David E

Potrei non aver ricevuto la tua nota ma rowHeight è una proprietà di UITableView. Basta collegare il tuo tavolo a qualche presa e il gioco è fatto.
Viktor Kucera

4
Questo perché se mantieni il valore 44pt in IB, considererà che desideri utilizzare celle a ridimensionamento automatico. stackoverflow.com/questions/25888126/… (ma, sì, questo è davvero un comportamento strano)
Guillaume Algis

Quindi a quanto pare avevo due metodi viewDidLoad e ho inserito self.tableView.rowHeight = 44;quello sbagliato. L'errore è andato via! grazie
David E

Grazie Guillaume Algis per aver reso questo più chiaro. Tuttavia è ancora molto inquietante.
Viktor Kucera

216

Stai riscontrando l'effetto collaterale di una fantastica nuova funzionalità nelle visualizzazioni da tavolo di iOS8: Automatic Row Heights.

In iOS 7, avevi righe di dimensioni fisse (impostate con tableView.rowHeight) oppure avresti scritto il codice per calcolare l'altezza delle celle e lo avresti restituito in tableView:heightForRowAtIndexPath. Scrivere codice per il calcolo dell'altezza di una cella potrebbe essere piuttosto complesso se avessi numerose viste nella tua cella e avessi diverse altezze da considerare con diverse dimensioni dei caratteri. Aggiungi Dynamic Type e il processo è stato un rompicoglioni.

In iOS 8, puoi ancora fare quanto sopra, ma ora l'altezza delle righe può essere determinata da iOS, a condizione che tu abbia configurato il contenuto della tua cella utilizzando il layout automatico. Questo è un enorme vantaggio per gli sviluppatori, perché quando la dimensione del carattere dinamico cambia o l'utente modifica la dimensione del testo utilizzando le Impostazioni di accessibilità, la tua interfaccia utente può essere adattata alla nuova dimensione. Significa anche che se hai un'etichetta UIL che può avere più righe di testo, la tua cella può ora crescere per adattarsi a quelle quando le celle ne hanno bisogno e ridursi quando non lo fa, quindi non ci sono spazi bianchi non necessari.

Il messaggio di avviso che stai vedendo ti sta dicendo che non ci sono abbastanza vincoli nella tua cella per il layout automatico per informare la tableview dell'altezza della cella.

Per utilizzare l'altezza della cella dinamica, che, insieme alle tecniche già menzionate da altri poster, eliminerà anche questo messaggio, è necessario assicurarsi che la cella abbia vincoli sufficienti per associare gli elementi dell'interfaccia utente alla parte superiore e inferiore della cella. Se in precedenza hai utilizzato il layout automatico, probabilmente sei abituato a impostare i vincoli Top + Leading, ma anche l'altezza della riga dinamica richiede vincoli in basso.

Il passaggio di layout funziona in questo modo, che si verifica immediatamente prima che una cella venga visualizzata sullo schermo, in modo just-in-time:

  1. Vengono calcolate le dimensioni per il contenuto con dimensioni intrinseche. Ciò include UILabels e UIImageViews, dove le loro dimensioni si basano sul testo o sulle UIImages che contengono, rispettivamente. Entrambe queste viste considereranno la loro larghezza come nota (perché hai impostato vincoli per i bordi di uscita / di entrata, o hai impostato larghezze esplicite, o hai usato vincoli orizzontali che alla fine rivelano una larghezza da un lato all'altro). Supponiamo che un'etichetta abbia un paragrafo di testo ("numero di righe" è impostato su 0 in modo che venga a capo automatico), può essere solo di 310 punti, quindi è determinato ad essere alto 120pt con la dimensione del carattere corrente.

  2. L'interfaccia utente è strutturata in base ai vincoli di posizionamento. C'è un vincolo nella parte inferiore dell'etichetta che si collega al margine inferiore della cella. Poiché l'etichetta è cresciuta fino a raggiungere un'altezza di 120 punti e poiché è vincolata alla parte inferiore della cella dal vincolo, deve spingere la cella "verso il basso" (aumentando l'altezza della cella) per soddisfare il vincolo che dice "fondo di l'etichetta è sempre a distanza standard dal fondo della cella.

Il messaggio di errore che hai segnalato si verifica se manca quel vincolo di fondo, nel qual caso non c'è nulla per "spingere" il fondo della cella lontano dalla parte superiore della cella, che è l'ambiguità segnalata: senza nulla da cui spingere il fondo in alto, la cella crolla. Ma Layout automatico rileva anche questo e ricorre all'altezza della riga standard.

Per quello che vale, e soprattutto per avere una risposta arrotondata, se implementi le altezze delle righe dinamiche basate sul layout automatico di iOS 8, dovresti implementarle tableView:estimatedHeightForRowAtIndexPath:. Questo metodo di stima può utilizzare valori approssimativi per le celle e verrà chiamato quando viene inizialmente caricata la visualizzazione tabella. Aiuta UIKit a disegnare cose come la barra di scorrimento, che non può essere disegnata a meno che la tableview non sappia quanto contenuto può scorrere, ma non ha bisogno di dimensioni totalmente accurate, poiché è solo una barra di scorrimento. Ciò consente di posticipare il calcolo dell'altezza effettiva della riga fino al momento in cui è necessaria la cella, il che è meno impegnativo dal punto di vista computazionale e consente di presentare più rapidamente UITableView.


3
Questa è un'ottima spiegazione del motivo principale di questo avvertimento. Grazie mille per il tuo tempo, Woodster!
Golden Thumb

4
Come quello che ha detto Woodster, ho perso la parte inferiore dei vincoli. Quando ho aggiunto il mio problema è stato risolto.
Golden Thumb

Dopo aver provato quasi 20 cose, questa è l'unica che ha funzionato!
Julio Rodrigues

Quest'uomo l'ha inchiodato! Si merita un voto positivo e questa deve essere la risposta accettata. +1
caraibi

1
Vedi questa risposta stackoverflow.com/a/29565073/4080860 per capire a quale cella mancano i vincoli.
hhanesand

11

Ho avuto questo problema dopo aver creato una personalizzazione UITableViewCelle aver aggiunto le mie visualizzazioni secondarie alla cella anziché alla sua contentView.


10

Per risolvere questo problema senza un metodo programmatico, regola l'altezza della riga della visualizzazione tabella in Impostazioni dimensioni dallo storyboard.

inserisci qui la descrizione dell'immagine


La migliore soluzione per me perché sta usando gli elementi dello storyboard invece delle linee per il codice.
zyc

6

Questo è un problema di layout automatico. Assicurati che le tue visualizzazioni secondarie abbiano tutti i vincoli. Per me, mancava il vincolo inferiore per l'etichetta del titolo nella cella. Quando l'ho aggiunto, l'avvertimento è sparito e tutto è apparso perfettamente.


Non so perché questo sia stato svalutato, in quanto è una risposta perfettamente buona. Vedi qui per un aiuto su capire quale cella è avere problemi in fase disposti stackoverflow.com/a/29565073/4080860
hhanesand

5

Abilita semplicemente le celle di visualizzazione tabella a ridimensionamento automatico

   tableView.estimatedRowHeight = 85.0
   tableView.rowHeight = UITableViewAutomaticDimension

e assicurati di aver aggiunto vincoli su tutti i lati di UITableViewCellas-

inserisci qui la descrizione dell'immagine


In realtà, l'avviso è scomparso quando ho disabilitato le celle tableview auto-dimensionate.
turingtested

@turingtested dovresti abilitare la cella tableview a dimensionamento automatico per fornire supporto su vari dispositivi.
Jack

D'accordo, ma per favore leggi la domanda originale. Quello che volevo dire era che la tua soluzione suggerita non funzionava, almeno non per me.
turingtested

FYI UITableViewAutomaticDimensionè stato rinominato inUITableView.automaticDimension
atineoSE

5

Se stai usando una cella statica o una cella dinamica, aggiungi semplicemente un'altezza di riga alla vista tabella nella tabella di ispezione e deseleziona l'automatico a destra dell'altezza della riga, è così che smetterai di ricevere questo avviso.inserisci qui la descrizione dell'immagine


Ho trovato il contrario più efficace: impostare un'altezza stimata esplicita e lasciare che l'altezza della riga stessa sia automatica.
NRitH

4

Ho ricevuto questo avvertimento oggi. Ecco cosa lo ha fatto scomparire per me (in Interface Builder)

1.Impostare il campo altezza riga per la vista tabella su un valore diverso da 44 2 Impostare il campo altezza riga per la cella tableView su un valore diverso da 44

Non ho dovuto apportare modifiche al codice


3

Nel mio caso, stavo costruendo la cella a livello di programmazione e continuavo a ricevere questo errore.

Stavo aggiungendo le subviews e vincoli nel UITableViewCell's initmetodo come questo:

addSubview(rankingLabel)
addConstraints(cellConstraints)

Ho risolto il problema aggiungendoli invece a quelli della cella contentView:

contentView.addSubview(rankingLabel)
contentView.addConstraints(cellConstraints)

1
Aggiungi sempre le visualizzazioni secondarie a contentView, non UITableViewCelldirettamente.
dinesharjani

3

Imposta l'altezza della riga stimata su zero e l'avviso scompare:

inserisci qui la descrizione dell'immagine


Il vero problema è un vincolo mancante da qualche parte. Probabilmente stai inserendo qualcosa in verticale invece di impostare i vincoli alto / basso
TruMan1

1

Anch'io ho sperimentato questo avvertimento passando a Xcode 6 GM. Ho ricevuto l'avviso solo quando ho ruotato il dispositivo nella posizione originale.

Sto usando UITableViewCells personalizzato. La visualizzazione della tabella dello storyboard è impostata sulla mia dimensione personalizzata (100.0 nel mio caso). Sebbene le celle della tabella vengano visualizzate correttamente come nelle versioni precedenti, non mi è piaciuto il messaggio di avviso.

Oltre alle idee di cui sopra, ho aggiunto questo

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 100.0;
}

Il rendering dello schermo ... risponde alla rotazione e non più messaggi di avviso.


Quindi ho provato a utilizzare il tuo metodo usando la linea che mi hai dato ma continuo a riscontrare lo stesso errore. Inoltre, non ho utilizzato la rotazione nella mia app.
David E

1

In xcode 6.0.1 avevo rimosso questi avvisi specificando l'altezza della riga usando:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 44.0;
}

1

Se hai creato un tableViewCell personalizzato per tableView, assicurati di aver assegnato entrambi i vincoli inferiore e superiore alle celle, potresti anche ricevere questo messaggio se le tue sottoview all'interno delle celle personalizzate sono allineate al centro Y che non visualizzerebbe alcun messaggio di errore ma creerebbe disordine con l'identificazione dell'altezza della riga per tableview a sua volta come nell'immagine che ho allegato, qui abbiamo vincoli sia in alto che in basso

Quando crei una cella personalizzata per tableView devi specificare l'altezza della riga o i vincoli superiore e inferiore per le visualizzazioni secondarie della cella personalizzata all'interno della cella (ad esempio l'etichetta nella cella personalizzata come nell'immagine sotto)

Ma se questo non funziona puoi provare a impostare l'altezza della riga per la tua cella invece di essere automatica come in questa immagine

Ma assicurati che se disattivi quel segno di spunta automatico devi regolare la dimensione della riga per le modifiche a livello di programmazione che avrebbero potuto essere eseguite automaticamente


0

Nello storyboard imposta il cell Row heightcampo con lo stesso valore Row heightdi tableView(entrambi con lo stesso valore hanno funzionato per me).

Se aggiungi una heightForRowAtIndexPathfunzione al tuo codice, potrebbe causare un problema di prestazioni perché verrà chiamata per ogni cella, quindi fai attenzione.


0

Potresti anche vedere questo messaggio se i tuoi unici vincoli sono impostati per allineare tutti gli elementi verticalmente e non hai / desideri un'altezza specificata per la cella. Se imposti un vincolo alto / basso sull'elemento, l'avviso scomparirà.


0

Ho avuto questo problema quando le mie etichette e visualizzazioni nella tableViewCell personalizzata erano vincolate a customCell, non alla sua visualizzazione del contenuto. Quando ho eliminato i vincoli e li ho collegati alle celle Visualizzazione contenuto, il problema è stato risolto.


0

Ho ricevuto lo stesso messaggio di errore, assicurati che tutti i tuoi punti vendita siano validi come i vincoli della vista tabella e della vista tabella


0

Se stai effettuando un calcolo dinamico dell'altezza,

  • dovresti avere tutti gli elementi collegati tra loro in termini di vincoli come alto e basso.
  • dovresti sicuramente avere un vincolo di fondo collegato all'elemento nella parte inferiore della tua cella

0

Ho anche un problema simile per la cella tableview personalizzata che ha un'altezza di riga dinamica. L'altezza dinamica non è stata riflessa e ha ricevuto lo stesso avviso nella console. La soluzione è l'aggiunta di visualizzazioni secondarie alla cella anziché a contentView. A proposito, ho creato sottoview programmaticamente.


0

Ho questo problema su TableViewCells in cui i vincoli sono impostati sull'inizializzazione ma dove il contenuto della cella viene caricato in seguito, questo significa che il motore di layout automatico non può determinare l'altezza. Le altre soluzioni qui non funzionano perché ho bisogno che l'altezza della cella siaUITableView.automaticDimension .

Ho appena aggiunto un vincolo extra alla cella:

contentView.heightAnchor.constraint(equalToConstant: 44, priority: .defaultLow)

0

Ho ricevuto questo avviso oggi. Tutto quello che ho fatto è stato solo aggiungere una riga in più al mio codice

tableView.rowHeight = 200;

aggiungi questa riga di codice all'interno del file

func tableView(_ tableView: UITableView, numberOfRowsInSection section:Int) -> Int {
  ...
}

e l'aspetto del codice finale

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  tableView.rowHeight = 200;
  ...
}

questo codice aumenterà l'altezza della cella della riga della tabella a 200 l'altezza predefinita è 44


-1

Ho lo stesso errore, a causa di questa riga è stato mostrato questo errore.

self.layer.backgroundColor = UIColor (white: 1, alpha: 0.2) come! CGColor

Ho appena cambiato la riga come segue per correggere l'errore

self.layer.backgroundColor = UIColor (white: 1, alpha: 0.2) .cgColor

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.