La larghezza massima automatica preferita del layout non è disponibile nelle versioni iOS precedenti alla 8.0


322

Ho aperto un progetto iOS esistente con Xcode6 beta6 e Xcode elenca i seguenti avvisi per i file Storyboard e Xib:

La larghezza massima automatica preferita del layout non è disponibile nelle versioni iOS precedenti alla 8.0

Ho provato a indirizzare l'avviso impostando la larghezza su esplicita come di seguito:

Tuttavia questo non ha risolto gli avvertimenti. Come possono essere rimossi?


3
Sto usando XCode 6.1 e ho aggiornato tutte le mie etichette su Preferred Width = Explicit. Questo ha risolto il problema per me.
Djburdick,

Risposte:


373

Aggiornamento 3:
questo avviso può anche essere attivato da etichette numberOfLinesimpostate su un valore diverso da 1 se la destinazione di distribuzione è impostata su 7.1. Questo è completamente riproducibile con il nuovo progetto a vista singola.

I passaggi per riprodurre:

  1. Crea un nuovo progetto a vista singola, obiettivo-c
  2. Impostare Target di distribuzione su 7.1
  3. Apri lo storyboard del progetto
  4. Rilascia un'etichetta sul controller di visualizzazione fornito
  5. Impostare il numeroOfLines per quell'etichetta su 2.
  6. Compilare

Ho presentato il seguente radar:
rdar: // problem / 18700567

Aggiornamento 2:
Sfortunatamente, questo è ancora una volta nella versione di rilascio di Xcode 6. Nota che puoi, per la maggior parte, modificare manualmente lo storyboard / xib per risolvere il problema. Per Charles A. nei commenti qui sotto:

Vale la pena ricordare che è possibile introdurre facilmente questo avviso per errore e l'avviso stesso non aiuta a trovare l'etichetta che è il colpevole. Questo è sfortunato in uno storyboard complesso. È possibile aprire lo storyboard come file di origine e cercare con la regex <label(?!.*preferredMaxLayoutWidth)per trovare etichette che omettono un attributo / valore preferitoMaxLayoutWidth. Se aggiungi preferitoMaxLayoutWidth = "0" su tali righe, equivale a contrassegnare esplicito e impostare il valore 0.

Aggiornamento 1:
questo bug è stato risolto in Xcode 6 GM.

Risposta originale
Questo è un bug in Xcode6-Beta6 e XCode6-Beta7 e per ora può essere tranquillamente ignorato.

Un ingegnere Apple nei forum degli sviluppatori Apple ha detto questo a proposito del bug:

La larghezza massima preferita del layout è una proprietà di layout automatico su UILabel che gli consente di crescere automaticamente in verticale per adattarsi al suo contenuto. Le versioni di Xcode precedenti alla 6.0 imposteranno la preferenzaMaxLayoutWidth per le etichette multilinea sulle dimensioni dei limiti correnti in fase di progettazione. In caso di modifica del layout orizzontale, sarà necessario aggiornare manualmente favoriteMaxLayoutWidth in fase di esecuzione.

iOS 8 ha aggiunto il supporto per il calcolo automatico preferitoMaxLayoutWidth in fase di esecuzione, il che rende ancora più semplice la creazione di etichette multilinea. Questa impostazione non è retrocompatibile con iOS 7. Per supportare sia iOS 7 che iOS 8, Xcode 6 ti consente di scegliere "Automatico" o "Esplicito" come preferitoMaxLayoutWidth nella finestra di ispezione delle dimensioni. Dovresti:

Scegli "Automatico" se scegli come target iOS 8 la migliore esperienza. Selezionare "Esplicito" se si sceglie come target <iOS 8. È quindi possibile inserire il valore di favoriteMaxLayoutWidth che si desidera impostare. L'abilitazione dei valori predefiniti "espliciti" alle dimensioni dei limiti correnti nel momento in cui è stata selezionata la casella.

Verrà visualizzato un avviso se (1) stai utilizzando il layout automatico, (2) "Automatico" è impostato per un'etichetta multilinea [puoi verificarlo nella finestra di ispezione delle dimensioni per l'etichetta] e (3) il tuo target di distribuzione <iOS 8.

Sembra che il bug sia che questo avviso viene visualizzato per i documenti di non completamento automatico. Se viene visualizzato questo avviso e non si utilizza il layout automatico, è possibile ignorare l'avviso.

In alternativa, puoi aggirare il problema utilizzando la finestra di ispezione dei file nello storyboard o xib in questione e modificare "Build per" in "Build per iOS 8.0 e versioni successive" Ispettore file Xcode


15
Vale la pena ricordare che è possibile introdurre facilmente questo avviso per errore e l'avviso stesso non aiuta a trovare l'etichetta che è il colpevole. Questo è sfortunato in uno storyboard complesso. Puoi aprire lo storyboard come file sorgente e cercare con la regex <label(?!.*preferredMaxLayoutWidth)per trovare etichette che omettono un preferredMaxLayoutWidthattributo / valore. Se si aggiunge in preferredMaxLayoutWidth="0"tali righe, è come contrassegnare esplicitamente e impostare il valore 0.
Charles A.

6
Esiste un modo programmatico per configurare un UILabel in modo da regolare automaticamente la preferenzaMaxLayoutWidth, senza effettivamente sottoclassarlo o implementarlo da qualche parte in layoutSubviews? Se si tratta di un comportamento che IB può abilitare, ciò suggerisce che è possibile impostare una proprietà o un valore magico. Ma nulla nei documenti o nelle intestazioni API lo dice.
algal

2
@CharlesA. Ho provato con un progetto vuoto e ho trovato un altro attributo di etichetta che attiverà questo avviso: se numberOfLinesè impostato su un valore diverso da 1, l'avviso avverrà indipendentemente dal fatto che sia stato preferredMaxLayoutWidthimpostato o meno.
Memmons,

2
@ MichaelG.Emmons Strano, non riesco a riprodurlo con un progetto pulito e una destinazione di distribuzione impostata su 7.1. Una volta impostato preferredMaxLayoutWidthsu 0 esplicito, l'avviso scompare indipendentemente dal numberOfLinesvalore. Ma forse questo è stato risolto nell'aggiornamento Xcode questa mattina?
Charles A.

2
Quindi ... è l'unica soluzione per impostare il numero di righe su 1 e modificarlo dal codice? questo non sembra professionale
jomafer

315

Per trovare le etichette dei problemi in uno storyboard di grandi dimensioni, segui i miei passaggi di seguito.

  1. In Navigator Issue di xCode fare clic con il tasto destro sull'errore e selezionare "Rivela nel registro". (Nota: @Sam suggerisce di seguito, guarda nel navigatore dei rapporti di xCode . Inoltre nei commenti di @Rivera nei commenti "A partire da Xcode 6.1.1, facendo clic sull'avvertimento si apriranno automaticamente ed evidenzieranno l'etichetta in conflitto". Non l'ho provato ).

inserisci qui la descrizione dell'immagine

  1. Questo mostrerà l'errore con un codice alla fine del file dello storyboard. Copia il valore dopo .storyboard

inserisci qui la descrizione dell'immagine

  1. Successivamente, rivela lo storyboard come file di origine. inserisci qui la descrizione dell'immagine

  2. Ricerca. Dovresti essere in grado di distinguere facilmente l'etichetta da qui guardando il contenuto. inserisci qui la descrizione dell'immagine

Una volta trovata l'etichetta, la soluzione che ha funzionato per me era impostare la "larghezza preferita" su 0.

inserisci qui la descrizione dell'immagine

A proposito, puoi sempre ottenere rapidamente l'id di un elemento dell'interfaccia selezionando l'elemento e guardando sotto l'ispettore di identificazione. Molto maneggevole.

inserisci qui la descrizione dell'immagine


36
Questa dovrebbe essere la risposta accettata! Questo in realtà risolve il problema. Aiuta anche a trovare altri problemi nello Storyboard che non si presentano normalmente. Una cosa: trovo che Report Navigator sia molto più affidabile del clic con il pulsante destro del mouse su "Rivela nel registro"
Sam Spencer,

1
Adoro questa risposta, molto semplice e risolto l'avvertimento. Grazie mille!
Ethan Parker,

1
Grazie mille muchhhhhh :)
SR Nayak,

2
Perché imposti la larghezza preferita su zero anziché sulla larghezza mostrata nel generatore di interfaccia?
Biclops,

9
Risposta fantastica! Puoi cercare l'id oggetto direttamente dalla vista IB dello Storyboard. Basta fare un Ctrl-f. Non è necessario aprirlo come codice sorgente e quindi tornare alla visualizzazione IB per modificare la larghezza preferita.
AndroidDev,

36

Puoi risolvere questo problema senza aprire lo storyboard come fonte . Questo avviso viene attivato da UILabels se numberOfLines! = 1 e la destinazione di distribuzione è <8.0

COME TROVARLO?

  1. Vai a Issue Navigator (CMD + 8) e Seleziona l'ultima build con l'avviso inserisci qui la descrizione dell'immagine
  2. Individua gli avvisi ( cerca " Layout massimo preferito automatico ") e premi il pulsante Espandi a destra
    inserisci qui la descrizione dell'immagine
  3. Trova l'ID oggetto di UILabel inserisci qui la descrizione dell'immagine
  4. Apri lo Storyboard e CERCA (CMD + f) per l'oggetto. Sarà selezionare ed evidenziare l'UILabel
  5. Impostare Preferred Width = 0 "Explicit" come altri hanno suggerito

23

La soluzione è abbastanza semplice

Abilita Build per iOS 8 e versioni successive

inserisci qui la descrizione dell'immagine


abbastanza semplice e distruttivo. Solo l'85% degli utenti iOS è su iOS8 + developer.apple.com/support/app-store
aryaxt

6
@aryaxt Mi dispiace dirti che ti sbagli. È possibile impostare una destinazione di distribuzione nelle impostazioni del progetto su iOS 7 o versioni precedenti e modificare Build per i documenti IB su iOS 8 e versioni successive e funzionerà su iOS 7. Verificare e rimuovere il downvote. Puoi verificarlo qui developer.apple.com/library/ios/recipes/…
Alejandro Luengo,

1
Come sempre la risposta migliore non è quella accettata ... :) Saluti!
HepaKKes

AGGIORNAMENTO per iOS9.3 e versioni successive: i dispositivi iOS7 non eseguono più il rendering degli storyboard con le impostazioni precedenti. In passato funzionava prima dell'aggiornamento 9.3. Sembra che Apple abbia cambiato qualcosa nel loro processo automatico pre-release.
Pechar,

4

Ora la mia versione di Xcode è 6.1. Ma ho ricevuto anche questo avviso. mi infastidisce molto. dopo la ricerca ancora e ancora. Ho trovato la soluzione.

Motivo: devi aver impostato le tue linee UILabel> 1 nello Storyboard.

Soluzione: imposta l'attributo UILabel Lines su 1 nello Storyboard. riavvia il tuo Xcode. Funziona per me, spero che possa aiutare più persone.

Se hai davvero bisogno di mostrare le tue parole più di 1 riga. dovresti farlo nel codice.

//the words will show in UILabel
NSString *testString = @"Today I wanna set the line to multiple lines. bla bla ......  Today I wanna set the line to multiple lines. bla bla ......"
[self.UserNameLabel setNumberOfLines:0];
self.UserNameLabel.lineBreakMode = NSLineBreakByWordWrapping;
UIFont *font = [UIFont systemFontOfSize:12];
//Here I set the Label max width to 200, height to 60
CGSize size = CGSizeMake(200, 60);
CGRect labelRect = [testString boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:[NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName] context:nil];
self.UserNameLabel.frame = CGRectMake(self.UserNameLabel.frame.origin.x, self.UserNameLabel.frame.origin.y, labelRect.size.width, labelRect.size.height);
self.UserNameLabel.text = testString;

3
"Se hai davvero bisogno di mostrare le tue parole più di 1 riga. Dovresti farlo nel codice." Questo è un troll, giusto?
webstersx,

@webstersx penso che sia serio
Jasper

4

Riassumendo, per me, seguendo le due istruzioni precedenti per modificare tutte le istanze in cui numberOfLines = da 0 a 1 o superiore, e aggiungendo manualmente favoriteMaxLayoutWidth = "0" a ciascuna istanza di un'etichetta all'interno della fonte dello storyboard, sono stati corretti tutti i miei avvertimenti.


Amico, sei un WIZZARD! Funziona anche con un UIScrollerView come previsto. MIGLIORE SOLUZIONE finora perché ho potuto lasciare il target di implementazione del mio pennino su iOS7.0
Yaro

3

Dato che non ho una reputazione di 50 Stackoverflow non mi lascia commentare la seconda migliore risposta. Ho trovato un altro trucco per trovare l'etichetta del colpevole nello Storyboard.

Quindi, una volta che conosci l'ID dell'etichetta, apri lo storyboard in una scheda separata con i controller di visualizzazione visualizzati e fai semplicemente il comando F e il comando V e ti porterà direttamente a quell'etichetta :)


Intendi cercare nel progetto l'id etichetta.
Borzh,

2

Ho funzionato selezionando il layout originale che avevo nella selezione W / H. Lo storyboard funziona come previsto e l'errore è scomparso.

Assicurati anche di sviluppare per iOS 8.0. Verifica quello dalle impostazioni generali del progetto.

Questo è dove dovresti premere.


1

Ho avuto questo problema ed è stato in grado di risolverlo aggiungendo vincoli per determinare il massimo con un'etichetta.

Quando si rilascia un'etichetta multilinea, non è impostato un vincolo per imporre la larghezza all'interno della vista padre. È qui che entra in gioco il nuovo PreferredMaxWidth. Su iOS 7 e precedenti devi definire tu stesso la larghezza massima. Ho semplicemente aggiunto un vincolo di 10px a sinistra e a destra dell'etichetta.

Puoi anche aggiungere un vincolo <= width che risolve anche il problema.

Quindi questo non è in realtà un bug, devi semplicemente definire tu stesso la larghezza massima. L'opzione esplicita menzionata in un'altra risposta funzionerà anche mentre stai impostando questo valore di larghezza, tuttavia dovrai modificare questo valore se vuoi che la larghezza massima cambi in base alla larghezza padre (poiché hai impostato esplicitamente la larghezza).

La mia soluzione di cui sopra garantisce che la larghezza sia sempre mantenuta, indipendentemente dalla dimensione della vista padre.


1

Per qualche motivo, anche se si modifica Target di distribuzione iOS su 8.0 o versioni successive, i file Xib non adottano tale modifica e rimangono con le impostazioni precedenti nella finestra di ispezione File

Ispettore di file in Xib dopo aver modificato il target di distribuzione iOS

Pertanto, è necessario modificarlo manualmente per ogni Xib Dopo il cambio manuale

Una volta fatto, l'avvertimento scompare :-)

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.