Che cos'è "Vincola al margine" in Storyboard in Xcode 6


249

Sto lavorando con autolayout e vincoli e ho scoperto che esiste Constrain to marginsun'opzione in Xcode 6 che non era presente in Xcode 5 ed è selezionata per impostazione predefinita.

Ho creato un progetto di prova, quindi ho aggiunto un UITableViewsu un ViewController con il frame impostato sulla stessa dimensione della vista e aggiunto vincoli

Xcode 6 Puoi vedere qui anche se tableview ha lo stesso frame della vista Xcode suggerisce di aggiungere -16 come vincolo mentre Xcode 5 suggerisce di aggiungere la spaziatura 0.

Con Vincola a margine controllato

Ora quando si deseleziona l'opzione "Vincola al margine" si comporta come Xcode 5 e suggerisce di aggiungere 0 come vincolo

Con Vincola a margine UnChecked

Inoltre, ho scoperto che una volta aggiunto il vincolo con Vincola al margine verificato, non sono più in grado di aprire il file dello storyboard in Xcode 5, quindi è sicuramente qualcosa di nuovo in Xcode 6

Spero di riuscire a spiegare correttamente la mia domanda. Vorrei capire cosa fa realmente "Vincola a margine" e quando dovrei e non dovrei usarlo. Mi scuso se è qualcosa di molto semplice ed evidente.

MODIFICARE

Ho trovato qualcosa sui margini del layout nella discussione qui , mi chiedo se sia correlato a questo.


15
Non c'è bisogno di scusarsi: non è ovvio cosa faccia.
Ben Clayton,

4
+1 non c'è bisogno di scusarsi, volevo fare anche questa domanda. A proposito: per aprire lo storyboard in Xcode5 dai un'occhiata a: stackoverflow.com/a/25298909/529243
Olaf

1
Questa è la cosa più vicina a una spiegazione che ho trovato: stackoverflow.com/questions/25275901/…
Nathaniel,

Come disabilitarlo?
orkenstein,

2
Sì, questo è il vero dolore. Non sono riuscito a capire come deselezionarlo permanentemente.
Bhumit Mehta,

Risposte:


315

Non capisco affatto perché le persone si lamentino del fatto che " Margini provocherebbe un arresto definitivo su qualsiasi cosa prima di iOS 8. "

L'impostazione dei vincoli relativi al margine in un file xib o nello storyboard NON provoca l'arresto anomalo della tua app su iOS7 e NON fa alcuna differenza nell'interfaccia utente sul tuo dispositivo iOS7, purché non tocchi le proprietà UIView.layoutMarginse UIView.preservesSuperviewLayoutMarginsnel codice.

Cosa sono i margini in iOS8

I margini del layout rappresentano il riempimento all'interno di un UIViewsistema che può essere utilizzato dal sistema di layout durante la creazione di viste secondarie, per garantire che rimanga uno spazio tra il bordo di una vista e una vista secondaria. A questo proposito è molto simile alla proprietà padding associata ai blocchi nei CSS.

inserisci qui la descrizione dell'immagine

Per impostazione predefinita, a UIViewha margini di layout di 8 punti su ciascun lato e questo non può essere modificato in Interface Builder . Tuttavia, impostando la UIView.layoutMarginsproprietà nel codice, che è disponibile solo su iOS8, è possibile regolare questi valori.

Puoi ottenere IB per visualizzare i margini con Editor> Area di disegno> Mostra rettangoli layout: inserisci qui la descrizione dell'immagine

I margini possono essere utilizzati per semplificare il layout delle visualizzazioni e delle visualizzazioni secondarie. OgniUIView margini per impostazione predefinita, ma influiscono solo sul posizionamento della vista quando si imposta un vincolo correlato a un margine.

Come usare i margini

L'unico modo per utilizzare i margini in Interface Builder è verificare l' opzione relativa al margine durante la configurazione dei vincoli. Questo è il modo in cui indirizzi il tuo vincolo all'utilizzo dei margini anziché dei bordi quando definisci la mia vista.

inserisci qui la descrizione dell'immagine

Diamo un'occhiata a quattro diversi modi di impostare un vincolo principale tra una vista e la sua sottoview. Per ogni vincolo che esaminiamo, la prima associazione descritta sarà la guida della sottoview e la seconda sarà la guida della superview . Ciò a cui si desidera prestare particolare attenzione è lo stato di verifica e deselezione dell'opzione Relativo al margine di ciascuna estremità del vincolo, poiché ciò definisce se il vincolo è legato al margine o al bordo della vista.

  1. Primo elemento (deseleziona), secondo elemento (controllo): in questo caso, stiamo dichiarando che il bordo sinistro della sottoview dovrebbe allinearsi al margine sinistro della superview (come mostrato in questa immagine).

inserisci qui la descrizione dell'immagine

  1. Primo elemento (deseleziona), secondo elemento (deseleziona): entrambi utilizzano il bordo, non il margine . In questo caso, stiamo dichiarando che il bordo sinistro della sottoview dovrebbe allinearsi al bordo sinistro della superview.

inserisci qui la descrizione dell'immagine

  1. Primo elemento (spunta), secondo elemento (deseleziona): in questo caso, stiamo dichiarando che il margine sinistro della sottoview dovrebbe allinearsi al bordo sinistro della superview. Questo tipo di layout rende effettivamente la sottoview sovrapposta alla superview.

inserisci qui la descrizione dell'immagine

  1. Primo elemento (controllo), secondo elemento (controllo). Questo ha effettivamente lo stesso effetto del caso 2, poiché sia ​​la sottoview che la superview hanno lo stesso margine predefinito. Stiamo dichiarando che il margine sinistro della sottoview dovrebbe allinearsi al margine sinistro della superview.

inserisci qui la descrizione dell'immagine

Cosa c'è di buono in Margins

Questa nuova funzionalità (iOS8) influisce sullo sviluppo dell'interfaccia utente solo se si decide di utilizzare i margini.

Utilizzando i margini è possibile regolare il posizionamento di più visualizzazioni secondarie che condividono una relazione comune con una visualizzazione condivisa modificando il valore di una singola proprietà. Questa è una chiara vittoria sull'impostazione di tutti i vincoli associati con valori fissi, perché se è necessario aggiornare tutta la spaziatura, invece di modificare ogni valore uno per uno, è possibile modificare contemporaneamente tutti i posizionamenti rilevanti aggiornando il margine della superview con una singola riga di codice come questo:

self.rootView.layoutMargins = UIEdgeInsetsMake(0, 50, 0, 0);

Per illustrare questo vantaggio, nel seguente caso tutti i bordi di sinistra della sottoview sono allineati al margine sinistro della loro superview. Pertanto, la modifica del margine sinistro della superview influirà su tutte le subview contemporaneamente.

inserisci qui la descrizione dell'immagine


Grazie per la spiegazione dettagliata. Lo segnerò come una risposta accettata in quanto questo spiega bene le cose.
Bhumit Mehta,

Grazie @Bhumit, spero che questa risposta sia d'aiuto.
Scott Zhu,

4
"Non capisco affatto perché le persone si lamentino". Bene, forse il comportamento è cambiato con uno degli ultimi beta, non ho verificato. Ma almeno qualche mese fa, ha causato un arresto anomalo anche se non hai provato a impostare layoutMargins nel codice.
KPM,

Vale la pena sottolineare che quando si aggiungono nuovi vincoli, le versioni più recenti di Xcode consentono di deselezionare una casella per "Vincola ai margini" che imposta lo stesso flag "Relativo ai margini". Questo è utile perché consente di risparmiare pochi clic! Grande risposta A proposito, così ben spiegato e le immagini sono state molto utili.
EricWas

Ho notato che le immagini sono ospitate su dropbox. Non sarebbe meglio ospitare le immagini su SO?
test del

63

In iOS 8 ora hai la possibilità di definire i tuoi vincoli relativi a un margine predefinito rispetto ai limiti della superview, anziché ai limiti della superview stessa. Sì, è totalmente correlato ai margini di layout che hai indicato nei documenti. Un vantaggio è che puoi ridefinire i margini in modo dinamico o in modo diverso per ogni tipo di dispositivo e il layout verrà aggiornato di conseguenza senza modificare i vincoli.

Quando usarlo: quando vuoi approfittare di questa nuova flessibilità.

Quando NON utilizzarlo: per qualsiasi app destinata a funzionare su iOS 7 o versioni precedenti.


21
Questa sarebbe una bella funzionalità se non fosse abilitata per impostazione predefinita e causasse comunque un arresto anomalo su qualsiasi cosa precedente a iOS 8.
TylerJames

1
Non potrei essere più d'accordo.
KPM,

42

La proprietà in UIView è: layoutMargins. Vedi i documenti Apple . Fondamentalmente se i margini del layout sono 8,8,8,8 (impostazione predefinita), un vincolo con 0 spazio iniziale per il margine del contenitore avrà una posizione x di 8. Nota che questo è disponibile solo su iOS8 o versioni successive.

Per tutti coloro che non vogliono che i loro vincoli vadano al margine del contenitore:

CTRL + clic + trascina per mostrare il popup di creazione del vincolo.

Se il menu mostra di creare il vincolo al margine per impostazione predefinita, tenere premuto l'opzione / alt per consentire il vincolo al contenitore e non al margine del contenitore.

Ora mostrerà l'opzione per creare il vincolo NON al margine. Questo è MODO più veloce nel mio utilizzo.


3
Questa è probabilmente la migliore soluzione che ho scoperto là fuori. Deselezionare "constain to margin" non sempre funziona e sembra un po 'troppo magico. Questo è perfetto.
Levi McCallum,

Perché mai l'impostazione predefinita non è 10pt?
ZaBlanc,

11
Apple ha una storia di scelta di lunghezze e dimensioni basate sulla ricerca dell'usabilità, non selezionando i numeri che preferiamo coloro che leggono il codice. Ad esempio, l'altezza predefinita per molte cose è 44 o 35 pt. @ZaBlanc
Kyle Robson,

Soluzione perfetta quando aggiungo vincoli sullo storyboard senza margine per impostazione predefinita. Grazie!
Inix
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.