iOS8: i vincoli suggeriscono ambiguamente un'altezza pari a zero


100

Qualcuno ha idea di come eseguire il debug di questo?

Avviso una sola volta: rilevato un caso in cui i vincoli suggeriscono in modo ambiguo un'altezza zero per la visualizzazione del contenuto di una cella tableview. Stiamo considerando il collasso non intenzionale e utilizziamo invece l'altezza standard.

Le righe hanno un'altezza fissa come impostata da

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

E tutti constraintssembrano essere felici ...

Risposte:


129

Forzare un'altezza di ritorno e un'altezza stimata ha fatto scomparire l'avvertimento nel mio caso.

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

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

Un'altra soluzione in cui non hai bisogno dei due override è semplicemente quella di usarla self.tableView.rowHeight = 44;nel tuo loadViewmetodo o init.


1
Ho più righe di tipo nella sezione e solo una di esse ha un'altezza dinamica. quindi non funziona
Raj Aggrawal

Se impostiamo l'altezza predefinita in xib / storyboard, non dobbiamo implementare questi metodi.
Satyam

77

È anche possibile aggiungere vincoli verticali dalla parte superiore e inferiore della visualizzazione del contenuto. Ciò renderà felice il layout automatico (perché ora sa come calcolare l'altezza della cella da solo).


2
Questo ha funzionato per me. Ho esaminato tutte le celle del contenitore e mi sono assicurato che almeno una sottoview abbia un vincolo "spazio superiore al contenitore" e uno "spazio inferiore al contenitore".
Rog182

7
Questa è la risposta giusta per iOS 8 quando si utilizzano celle di visualizzazione tabella a ridimensionamento automatico.
tsafrir

1
Intendi i vincoli dagli elementi all'interno della visualizzazione del contenuto all'inizio e alla fine della visualizzazione del contenuto?
Zack Shapiro

Ho provato questo ma continuo a ricevere avvisi di vincoli in conflitto.
Shirish Kumar

2
Assicurati di aggiungere il vincolo superiore e inferiore alla visualizzazione del contenuto della cella, non la cella stessa. Se si aggiunge vincolo alla cella, il codice sarà ancora lavoro, ma tenterà di utilizzare l'altezza pari a 0.
frin

26

Se stai usando i vincoli di autoLayout e UITableViewAutomaticDimension, questo errore non è un problema errato da scartare sovrascrivendo la tua altezza nel codice. Significa che determinare automaticamente l'altezza della cella non funziona perché non sono necessari i vincoli verticali appropriati.

Se sei come me e ricevi questo errore e hai bisogno di aiuto per identificare quale cella ha generato l'errore, puoi aggiungere la seguente riga subito prima del ritorno del tuo metodo "heightforRowAtIndexPath".

NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]);

Questo stamperà un lungo elenco di sezioni e righe, ma l'errore apparirà immediatamente dopo la particolare cella che causa l'errore, e potrai identificare rapidamente quale cella sta causando il problema e correggere i tuoi vincoli di conseguenza. Ciò è particolarmente utile per le celle statiche. Sovrascrivere l'altezza con un numero inserito manualmente funzionerà se non stai utilizzando autoLayout e altezze automatiche delle celle, ma essenzialmente disabiliterà queste funzionalità che è una soluzione molto scarsa se è qualcosa che stai cercando di utilizzare.

Se in precedenza non stavi utilizzando il metodo 'heightForRowAtIndexPath' ma desideri eseguire il debug di questo errore senza annullare l'impostazione UITableViewAutomaticDimension, aggiungilo semplicemente al tuo codice:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]);
    return UITableViewAutomaticDimension;
}

Grazie mille. Questo mi ha aiutato molto. All'inizio ho pensato che il problema fosse con un'altra cella di visualizzazione tabella. Dopo il debug si è scoperto che il problema era con un altro.
akozin

Mi piacerebbe farlo, ma lungo, sezione e riga non sono identificate. Potresti chiarire cosa dovrebbero essere in Swift?
DrWhat

9

Sembra esserci un bug in XCode 6.1 che causa questo problema se si utilizza il layout automatico e non si specifica un valore per l'altezza della riga per ciascuna cella della vista tabella, ma si lascia invece il valore "predefinito". Selezionando semplicemente la casella di controllo "Personalizzata" accanto all'altezza della riga, per ogni cella, l'avviso scompare.


2
Se stai utilizzando celle a ridimensionamento automatico, devi lasciare l'altezza della riga impostata su "predefinita".
phatmann

1
Questo ha risolto l'avvertimento. Ma credo che appaia solo quando si utilizza Static Cells in TableView
MontiRabbit

1
@phatmann Questo problema si verifica solo per le celle statiche, quindi le celle non dovrebbero essere auto-dimensionate.
Ltm

@ltm potrebbe non essere utile le celle a ridimensionamento automatico, nelle celle statiche, se l'utente ha il testo ingrandito forse? (Sai, in Accessibilità nelle impostazioni dell'iPhone)
Byron Coetsee

Penso che non sia un bug, potrebbe essere un problema con i vincoli verticali, devono descrivere completamente l'altezza della cella, almeno per le visualizzazioni di tabella con dimensione automatica.
juanjo

3

Sì, ottieni tutti i vincoli "felici" anche nel caso in cui hai solo vincoli orizzontali per gli elementi nella cella della vista tabella. Ho avuto lo stesso problema. È necessario aggiungere anche vincoli verticali. In questo modo, l'avvertimento scomparirà.


3

I vincoli possono essere soddisfatti per lo scopo del layout, ma non per lo scopo dell'altezza automatica delle file. Un layout felice significherebbe che il contenuto può essere disposto senza ambiguità. Ciò soddisferà i controlli in Interface Builder.

Un layout felice per l'altezza della riga automatica significherebbe che, oltre a quanto sopra, includi anche vincoli nella parte inferiore della cella.

Maggiori informazioni qui: rilevato un caso in cui i vincoli suggeriscono in modo ambiguo un'altezza pari a zero


3

Ho usato l'altezza della riga 43 (o <> 44) nell'ispettore delle dimensioni della vista tabella e l'errore è scomparso. Utilizzando 44 ottengo l'errore. Xcode versione 6.0.1.

- Questa risposta è stata rimossa da un moderatore, per favore non farlo, risolve il problema. Questo RISOLVE il problema per me e potrebbe farlo anche per altri. Quindi potresti essere così gentile da non cancellarlo di nuovo.


2

Non sono riuscito a rimuovere l'avviso, ma per far funzionare i vincoli ho impostato la proprietà tableview, nuova per iOS8, estimatedRowHeightall'altezza fissa e ho rimosso l' heightForRowAtIndexPathimplementazione.


Se non è stato rimosso l'avviso, è il sistema che sta compensando il vincolo mancante e impostando l'altezza della riga == sulla proprietà cell.rowHeight. L'avviso riguarda una proprietà di guarigione automatica, se è stata riparata automaticamente significa che il problema non c'era?
Pedro Borges

2

Se ricevi questo avviso, è molto probabile che tu stia utilizzando il layout automatico e le tue celle non hanno alcun vincolo al loro interno.

È necessario interrompere l'utilizzo del layout automatico o implementare vincoli che definiscono in modo inequivocabile l'altezza delle celle.

Puoi disattivare il layout automatico nel generatore di interfacce deselezionando l'opzione "Usa layout automatico" nell'ispettore file a destra.

Se scegli di utilizzare il layout automatico e l'altezza delle celle è fissa, l'implementazione dei vincoli appropriati dovrebbe essere facile. È sufficiente aggiungere vincoli di altezza per le visualizzazioni secondarie della visualizzazione del contenuto della cella e implementare vincoli di spazio verticale tra le visualizzazioni secondarie e tra le visualizzazioni secondarie e la visualizzazione del contenuto. Ad esempio, se la tua cella ha un'etichetta al suo interno, questo funzionerebbe:

Vincoli verticali

  1. Vincolo di spazio verticale tra la parte superiore della visualizzazione del contenuto e la parte superiore dell'etichetta
  2. Vincolo di altezza fisso dell'etichetta
  3. Vincolo di spazio verticale tra la parte inferiore dell'etichetta e la parte inferiore della visualizzazione del contenuto

Vincoli orizzontali

  1. Vincolo di spazio orizzontale tra il bordo iniziale della visualizzazione del contenuto e il bordo principale dell'etichetta
  2. Vincolo di larghezza fisso dell'etichetta
  3. Vincolo di spazio orizzontale tra il bordo di uscita dell'etichetta e il bordo di uscita della visualizzazione del contenuto

Uso i vincoli e sembrano tutti felici, come menzionato nella domanda.
Chris

Questi sono vincoli per le visualizzazioni secondarie della visualizzazione del contenuto della cella? Come sono fisicamente? È possibile che tu abbia alcune celle che sono diverse? Se stai definendo le celle in modo che abbiano un'altezza fissa utilizzando le soluzioni di Frederic Bonner, i vincoli vengono ignorati.
Wrightak


1

In Swift forzare un'altezza di ritorno ha risolto il mio problema:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    if(indexPath.row == 0){
       return CGFloat(131.0)
    }else if(indexPath.row == 8){
       return CGFloat(97.0)
    }else{
       return CGFloat(44.0)
    }
}

1

Per una soluzione standard per torbiere, nessun vincolo, nessuna stima delle altezze o progettazione eccessiva del problema. Ho creato un progetto predefinito, cablato il tableview ma ho dimenticato di mettere il delegato di altezza nel controller di visualizzazione . Per far sparire semplicemente questo avvertimento è necessario questo.

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

Nel controller di visualizzazione della tabella.


1

Stavo usando un mapView all'interno di uitableviewcell. Ho modificato l'altezza della visualizzazione della mappa a 1/3 delle dimensioni dello schermo del dispositivo. Ho ricevuto lo stesso errore. Ho corretto l'errore aggiungendo i vincoli mancanti alla visualizzazione del contenuto di uitableviewcell.

1) Cancella i vincoli di contentView.

2) Impostare Reimposta su Costanti suggerite per contentView.

inserisci qui la descrizione dell'immagine

3) Aggiungi i vincoli mancanti, se presenti

4) Ci assicuriamo che la visualizzazione del contenuto abbia tutti i vincoli richiesti. inserisci qui la descrizione dell'immagine


0

Nel mio caso, è perché sto progettando la cella con xib e dimentico di aggiungere quel file xib alla destinazione.

Dopo aver aggiunto quel file xib alla destinazione, il problema è scomparso


0

Mentre le risposte in questa pagina che parlano dell'aggiunta di vincoli di altezza o della restituzione manuale di rowHeights come 44 in heightForRowAtIndexPath fanno scomparire l'avviso, sono superflue perché si tratta di un bug in Xcode visibile almeno nella versione 6.3.2 (6D2105).

Se imposti un punto di interruzione in viewDidLoad, vedrai che self.tableView.rowHeight = -1 (UITableViewAutomaticDimension) anche se specifichi un'altezza di riga di 44 nello storyboard. Questo perché Apple presume erroneamente che tu voglia altezze di riga dinamiche se lasci l'altezza di riga a 44, perché non hanno fornito un flag per specificare la tua preferenza.

Ecco alcune possibili soluzioni e i loro risultati:

  • Imposta l'altezza della riga su 43 o 45 nello storyboard (funziona).

  • Restituisce manualmente un'altezza di 44 in heightForRowAtIndexPath (funziona).

  • Aggiungi vincoli di altezza tra gli elementi di UITableViewCell e il suo contentView (funziona).

Sfortunatamente, queste soluzioni richiedono la modifica del design, l'aggiunta di vincoli non necessari o l'aggiunta di codice non necessario per aggirare un bug. Ho provato (quello che pensavo fosse) la soluzione più semplice:

  • Imposta l'altezza di ogni UITableViewCell su 44 (personalizzato) nello storyboard (non riesce).

Volevo davvero una soluzione di storyboard pura a questo, quindi alla fine ho provato:

  • Aggiungi un attributo di runtime definito dall'utente a UITableView nello storyboard e assegna un nome a UITableView con una nota su come viene impostato il suo rowHeight in modo che i futuri sviluppatori possano trovarlo: (funziona):

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

Questi bug sono fin troppo comuni nello sviluppo iOS e costringono gli sviluppatori a dedicare tempo eccessivo a soppesare le ramificazioni di come le loro soluzioni influenzeranno la manutenibilità a lungo termine.

Dal momento che trovare una soluzione concettualmente corretta che sia gestibile e non sembri offuscata è così sfuggente e supponendo che Apple correggerà il bug e che 44 sarà l'altezza di riga predefinita per il prossimo futuro, allora il vincolo o definito dall'utente Le soluzioni con attributi di runtime sono probabilmente le più gestibili.


0

Ci sono due cose importanti che accadono qui, credo.

1) È semplicissimo sbagliare i vincoli se stai ctrl + trascinando. Quindi, ricontrolla di averlo fatto correttamente. È meglio usare il vassoio sul lato sinistro dello schermo per disegnare questi vincoli.

2) Invece di specificare il stimatoRowHeight in ViewDidLoad o da qualche altra parte, utilizzare il metodo delegato

override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {}

Questo ha risolto il problema immediatamente per me.


Perché stai usando l'override?
FractalDoctor

0

Ho anche visto questo errore quando si usano storyboard universali o xib. Se trascuri di specificare i vincoli appropriati per la classe di dimensioni Any x Any, ho visto apparire questo errore.

Apple sembra aver risolto questo problema per iOS9. L'errore è accaduto solo su 8.4 per me.


0

Sono andato in tondo per giorni tra questo errore e un altro errore in cui venivano creati vincoli (non ho idea di dove) che fossero in conflitto con i vincoli che volevo. L'ho persino fatto funzionare in un caso in cui ogni proprietà visibile era identica all'altra. L'unica soluzione che ho trovato è stata quella di passare al atomico: creare un file completamente nuovo con xib e ricominciare a ricollegare i punti vendita incollando il vecchio codice. Potrebbe non essere la soluzione migliore, ma a volte, se il problema non è visibile, c'è poco altro da fare. Almeno, passare all'atomica è un buon modo per rivedere cosa sta succedendo.

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.