Xcode 9 - "I vincoli di larghezza fissa possono causare ritagli" e altri avvisi di localizzazione


148

Ho scaricato il nuovo Xcode e in Interface Builder sto avendo un sacco di problemi con avvisi che dicono cose come:

Vincoli a larghezza fissa possono causare ritagli

Sembra così:

inserisci qui la descrizione dell'immagine

Ho localizzazione per diverse lingue e capisco l'avvertimento che in un'altra lingua le dimensioni di un'etichetta possono cambiare, ma la mia app non presenta questo problema. Ieri l'ho eseguito e testato in Xcode 8, andava bene. Non voglio passare ore e ore ad aggiungere nuovi inutili vincoli.

Qualche soluzione suggerita?


Ti suggerisco di dare un'occhiata al ridimensionamento automatico
Dark Innocence,

3
Anch'io. Ci sono pulsanti che garantiscono una larghezza di 50pt in tutte le lingue. Perché imbrattare la mia pagella per il trasferimento automatico altrimenti pulita con questo?
John Scalo,

9
Questo è sicuramente un grosso problema, ed è sorprendente che non ci siano più discorsi al riguardo: O
Fattie

2
Ottengo questo errore pur avendo solo la localizzazione inglese.
Tonalità

6
Per altri, se NON si dispone di alcuna localizzazione e si desidera semplicemente che questi avvisi scompaiano, spostare lo storyboard fuori dalla cartella Base.iproj come indicato qui: stackoverflow.com/a/45040394/1807644
William T.

Risposte:


179

Stavo ricevendo gli stessi avvisi anche senza più lingue nella mia app , il che mi ha portato a scoprire cosa stava realmente succedendo. . .

Qui ci sono alcune cose diverse. Sono stato in grado di mettere a tacere gli avvisi di larghezza fissa nella mia app modificando la larghezza delle spaziature dell'oggetto da larghezza fissa a maggiore o uguale o inferiore o uguale .

Questo può essere fatto selezionando l'oggetto nel generatore di interfaccia, andando su Impostazioni dimensioni e modificandolo lì:

inserisci qui la descrizione dell'immagine


In alternativa, seleziona il vincolo dalla struttura del documento, vai a Impostazioni dimensioni e modificalo lì:

inserisci qui la descrizione dell'immagine



Per quanto riguarda l'avvertenza nella parte superiore dello screenshot:

Risolti i vincoli iniziali e finali con un vincolo centrale possono causare il clipping

Ecco uno screenshot della mia app in cui stavo ricevendo lo stesso avvertimento:

inserisci qui la descrizione dell'immagine

Avevo l'etichetta con il segno @ impostato su iniziale e finale dei pulsanti, ma anche per allineare il centro con l'etichetta di classificazione . Una volta rimosso il vincolo di allineamento centrale , l'avvertimento è scomparso, ma mi è stato lasciato un insieme di oggetti impropriamente disposto.

È allora che mi sono dimesso per abbracciare Stack View . Per quanto fastidioso da usare, quando si ottengono tutti i vincoli e le impostazioni giuste, si distingue magnificamente e senza avvisi.


modificare

Come scrive Repose nei commenti, a volte semplicemente aggiungere> = 0 sarà quello che ti serve, poiché stai assicurando che due elementi non si sovrappongano.


2
> = 0 impedisce la sovrapposizione e risolto i problemi di sovrapposizione che stavo avendo prima, convertendo Leading / Trailing in Right / Left risolto l'errore di ritaglio per me. I risultati possono variare. Consultare il proprio medico prima di iniziare qualsiasi sviluppo software.
Riposare il

@Repose esattamente. Pensa a cosa potrebbe andare storto e aggiungi un vincolo per assicurarti che non lo sia.
Tonalità

Dimettersi di usare Stack View in iOS forse è ok, ma per OS X (mi dispiace MacOS) non è sempre una buona scelta. Apple dovrebbe saperlo. Il concetto di UI e UX ha spesso ipotesi diverse.
Joannes,

2
Sono d'accordo con l'adozione di UIStackView. È stato sicuramente un dolore e ho provato a farlo con un paio di vincoli, ho aggiunto un altro UIStackView ed è stato perfetto.
templeman15

1
C'è qualche altra opzione: cosa succede se voglio il mio controllo come larghezza fissa?
Kampai,

60

Puoi provare a disabilitare "Rispetta direzione lingua" in base al Vincolo per mettere a tacere l'avvertimento e vedere se aiuta. Seleziona il tuo vincolo e apri la finestra di dialogo Attributi / Dimensione. Si prega di vedere l'immagine allegata.

Se non hai intenzione di localizzare la tua app in altre lingue, questa soluzione non dovrebbe avere fallback. Per le app localizzate devi essere più consapevole delle dimensioni delle etichette e dei caratteri.

ps Questa soluzione funziona per iOS. Per macOS provare> = o <= per silenziare l'avviso.

pps Le etichette nella figura seguente sono molto più facili da creare utilizzando AutoLayout e la proprietà AttribString su un singolo UILabel o UITextView utilizzando NSMutableAttributedString. L'immagine è solo a scopo dimostrativo.

Mancanza di rispetto della direzione linguistica


1
Risolto il problema "Risolto il problema dei vincoli iniziali e finali con un vincolo centrale può causare il clipping". Grazie!
bim

4
Se hai provato questo e non sembra avere alcun effetto, prova a uscire da Xcode e a riavviarlo. Quel trucco ha funzionato per me.
T'Pol,

2
Non mi consente di deselezionarlo.
Scooter

1
Perfetto! questo ha funzionato per me e non c'è bisogno di cambiare i miei vincoli, grazie!
rgkobashi,

1
> = i vincoli hanno avuto effetti negativi per me a causa di vari schemi di priorità complessi. Ero pronto a inserire la mia etichetta in una vista, ma poi ho trovato la tua soluzione che ha funzionato! Grazie :)
KerCodex l'

33

Per le etichette e i pulsanti che sono localizzati questo avviso ha senso e dovresti fornire i vincoli necessari in modo che le etichette non si sovrappongano. Se non si sovrappongono ora potrebbero in futuro, quindi non sarà male fornire i vincoli.

Xcode ti aiuta ad aggiungere automaticamente questi vincoli:

Nella struttura del documento dello storyboard, fai clic sulla freccia gialla e scegli "fisso fisso" o "fisso fisso", a seconda di dove si trova il testo sullo schermo (sinistro o destro). Questo risolverà la maggior parte dei problemi.

Schermata di Xcode

Se hai questo problema con un pulsante senza testo (solo immagine), prova a rimuovere il "titolo predefinito" che potrebbe essere ancora impostato per il pulsante:

Schermata di Xcode


4
Nel mio caso, la rimozione del titolo predefinito ha rimosso l'avviso. Grazie!
Reinhard Männer,

Si noti che quando si aggiunge un UIButtona Storyboard, il default buttontitolo sarà button.
Miguel Tepale,

29

Con Labels, è possibile impostare Linesis 0e Autoshrinkproperties è Minimum Font Sizeper rimuovere gli Fixed Width Constraints May Cause Clippingavvisi, in questo modo:

inserisci qui la descrizione dell'immagine


3
Sì, devi solo impostare le linee su 0.
Reefwing

2
Le righe delle impostazioni su 0 fanno sì che l'etichetta si espanda a tutte le righe necessarie, il che potrebbe non essere quello desiderato.
nickdnk,

@nickdnk: so che, se hai corretto il limite di altezza per l'etichetta, non si espanderà.
Lionking,

21

Un'altra soluzione rapida!

Per un UIButton cambiando il titolo da testo normale a testo attribuito anche risolto il mio problema: -

inserisci qui la descrizione dell'immagine


Ha funzionato come un fascino!
artigianato

7

So che a questa domanda è già stata data una risposta, ma quello che ho fatto per correggere questo errore nel mio caso è stato quello di aggiungere la proprietà "Aspect ratio" e quindi eliminare il vincolo di larghezza o altezza che ha funzionato abbastanza bene ed è stato meno sforzo, e sono riuscito a mantenere lo stesso output e adattare la mia visione per i diversi dispositivi.


4

Swift 4, Xcode 9.1:

A proposito di questo problema, penso che il tuo oggetto non sappia quale sia la posizione centrale corretta nel contesto della sua superview e, usando remove, maggiore di parte delle volte usando le impostazioni di o altre principali / trealing non funziona correttamente. Innanzitutto, è necessario verificare i vincoli corretti della propria superview.

Se le superview sono impostate correttamente, puoi provare a "spiegare" al tuo oggetto qual è la posizione corretta nella vista impostando il vincolo "orizzontalmente nel contenitore" :

inserisci qui la descrizione dell'immagine


2

Se è necessario un vincolo di larghezza fisso per il pulsante, impostare semplicemente la priorità del vincolo di larghezza su 700.


1

Ho avuto lo stesso problema, ma quando lo cambio su >=ho impostato automaticamente la costante su 0, se lo scelgo60 per esempio, l'avviso appare di nuovo. Quindi ero in loop con il problema.

Potrei risolvere l'incorporamento di my Labelin aView

Editor > Embed In > View

In LabelI set Top, Bottom, Leadinge Trailingconconstant = 0

vincoli

In Viewho impostato quello constraintsche mi aspettavo prima.


1

Ho avuto lo stesso problema quando mi sono trasferito su Xcode 9 e ho trovato un approccio utile per alcuni tipi di layout. Nel mio caso, volevo un'intestazione di tabella in cui due colonne (UILabels) fossero di larghezza fissa e un'altra di larghezza variabile. Indipendentemente da come ho specificato le larghezze di colonna (incluso l'uso di vincoli maggiori o uguali anziché uguali, ecc.), Ho continuato a ricevere l'avvertenza sul possibile ritaglio. Nel mio caso, volevo che la colonna a larghezza variabile (UILabel) si agganciasse se necessario. Avrei potuto semplicemente ignorare l'avvertimento, ma non mi piacerebbe farlo.

L'approccio che ha funzionato qui è stato quello di creare un UIView con vincoli di dimensioni appropriate e incorporare UILabel come sottoview in UIView. Quindi il troncamento avviene se necessario e non ricevo alcun avviso. Funziona indipendentemente dal fatto che UIView / UILabel incorporato sia in StackView o meno.

Questo è essenzialmente lo stesso approccio di quello di Haroldo Gondim ma qui puoi vedere che funziona anche con o senza StackView.

L'immagine seguente mostra l'approccio, con e senza StackView. "SpacerName" è un UIView a larghezza variabile contenente un'etichetta e "SpacerPD" è uno con una larghezza fissa di 80. [I colori non sono significativi; proprio lì per mostrare dove sono le viste.]

inserisci qui la descrizione dell'immagine


0

Come puoi vedere nell'immagine qui sotto, ho riscontrato l'errore "I vincoli di larghezza fissa possono causare ritagli" perché sebbene avessi impostato la mia casella di testo in modo che fosse centrata verticalmente e la mia etichetta avesse un vincolo sul margine sinistro, non avevo definito un vincolo per la casella di testo in relazione all'etichetta, quindi XCode mi stava avvisando che la casella di testo poteva tagliare (essere visualizzato sopra) l'etichetta.

inserisci qui la descrizione dell'immagine

Dopo aver aggiunto il vincolo di sinistra alla casella di testo per rimanere sempre a una certa distanza dall'etichetta, l'errore è stato considerato risolto da XCode e non mi ha più infastidito con l'avviso di vincolo.


0

Ho avuto un problema simile quando provavo ad avere il pulsante con le stesse imbottiture dai bordi della super vista.

Caso di errore

Ho finito per usare il horizontal centervincolo e il equal widthsvincolo per il super view.

La mia soluzione


-1

Per correggere l'errore : i vincoli di larghezza fissa possono causare ritagli ”e altre localizzazioni È necessario selezionare la vista / l'oggetto, andare su" Mostra controllo dimensioni ", trovare il vincolo di larghezza e impostare la costante su Maggiore o uguale a:

Ispettore dimensioni

Per correggere l'errore : manca il vincolo iniziale / finale che può causare la sovrapposizione con altre viste

Ciò significa che la vista / oggetto Xcode si lamenta, manca un vincolo iniziale o finale a una vista vicina.

Mentre tieni il controllo, trascina verso un vicino per vista / oggetto

Contrl + Premi Clic

Aggiungi un vincolo iniziale o finale

Vincolo principale / finale


Se fai clic sul triangolo di avvertimento, Xcode li creerà automaticamente con un clic.
Lensovet,
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.