Maschere di ridimensionamento automatico a livello di programmazione rispetto a Interface Builder / xib / nib


216

Ero convinto (probabilmente falso) che abilitare l'indicatore del margine destro in xib equivale a usare il UIViewAutoresizingFlexibleLeftMargincodice interno e così via.

Quindi, ero solito pensare in base a questa istantanea: inserisci qui la descrizione dell'immagine

Più tardi oggi ho dovuto fare un controllo incrociato e mi sono imbattuto in questo thread .

E anche la documentazione di Apple, intitolata con la sezione intitolata "Gestire le modifiche al layout automaticamente usando le regole di ridimensionamento automatico" in questo link: https://developer.apple.com/library/content/documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/CreatingViews/ CreatingViews.html

Quindi ora ho un nuovo concetto nella mia mente su come impostare le maschere di ridimensionamento automatico a livello di codice sarebbe equivalente alle impostazioni di xib:

Scenario 1 : solo l'impostazione (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)equivale a:

(UIViewAutoresizingF FlexibleWidth | UIViewAutoresizingF FlexibleHeight)

In XIB?

Scenario 2 : l'impostazione (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin)nel codice equivale a:

(UIViewAutoresizingFLEXWidth | UIViewAutoresizingFLEXHeight | UIViewAutoresizingFLEXLeftMargin | UIViewAutoresizingF FlexibleRightMargin | UIViewAutoresizingF FlexibleTopMargin | UIViewAutoresizingFLEXBottomMargin)

In XIB?

I miei 2 scenari rinnovati sono corretti? Sono ora nella mia comprensione?


3
Mi stai prendendo in giro? Ma sembra che ci sia anche la mia confusione. Quindi, se voglio abbracciare la parte superiore, accendo la dimensione inferiore automatica. Ottimo lavoro mela. Questa è la configurazione più idiota che abbia mai visto.
user4951

1
Se vuoi abbracciarti devi assicurarti di non menzionare UIViewAutoresizingFlexTopMargin nel codice della maschera di bit. La mia ipotesi precedente era sbagliata ed è per questo che avevo pubblicato questa domanda per chiarire le cose.
Raj Pawan Gumdal,

Il tuo presupposto è corretto. Dove sbagli?
user4951

Sì, i due scenari citati sono corretti.

3
Ho creato uno strumento semplice per questo: erkanyildiz.me/lab/autoresizingmask puoi usarlo.
Erkanyildiz,

Risposte:


35

Sì, Interface Builder lo ha "invertito" in un certo senso (o UIView, a seconda di come lo guardi). I tuoi "scenari" citati sono corretti.


47

Sì, hai citato le cose correttamente. Inoltre, sono d'accordo che sia un po 'arretrato, quindi per questo apprezzo il tuo post.

Potresti utilizzare una macro del preprocessore UIViewAutoresizingFlexibleMarginsquando rendi flessibile il margine di una UIView in ogni direzione. L'ho inserito nel file di intestazione precompilato in modo che venga incluso ovunque.

#define UIViewAutoresizingFlexibleMargins                 \
              UIViewAutoresizingFlexibleBottomMargin    | \
              UIViewAutoresizingFlexibleLeftMargin      | \
              UIViewAutoresizingFlexibleRightMargin     | \
              UIViewAutoresizingFlexibleTopMargin

L'utilizzo UIViewAutoresizingFlexibleMarginsfarà sì che un elemento dell'interfaccia utente rimanga centrato poiché NON abbraccia un lato. Per far crescere / ridurre l'elemento con il suo genitore, impostare UIViewAutoresizingFlexibleWidtheUIViewAutoresizingFlexibleHeight rispettivamente .

Mi piace usare UIViewAutoresizingFlexibleMarginsperché in seguito posso fare riferimento come:

myView.autoresizingMask = UIViewAutoresizingFlexibleMargins;

invece di

myView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin;

Tutto a volte vedo questi margini o insieme su una riga come nell'esempio sopra. Difficile da leggere.


4
Flessibile in ogni direzione dovrebbe essere (UIViewAutoresizingF FlexibleWidth | UIViewAutoresizingF FlexibleHeight) Immagino? O sono di nuovo confuso!
Raj Pawan Gumdal,

4
FlexibleMargins manterrà l'elemento al centro (senza abbracciare il margine sinistro, superiore, destro o inferiore). La larghezza / altezza flessibile farà crescere / ridurre l'elemento ui rispettivamente.
Sam,

4
Adesso è tutto chiaro? Inoltre, intendevo davvero quando ho detto che ho apprezzato il tuo post. In realtà l'ho favorito b / c questo mi ha confuso in passato. Penso che sia un grande Q.
Sam

3
Sì, grazie, ora ho capito, "Margini flessibili" e "Larghezza / altezza flessibili". Questo spiega tutto e il tuo "non abbracciare il margine sinistro, superiore, destro o inferiore" è un buon modo di spiegare :)
Raj Pawan Gumdal,

0

inserisci qui la descrizione dell'immagine

Abilitare la freccia verticale / orizzontale (chiamata molla) all'interno della scatola renderà flessibile l'altezza / larghezza. Ma abilitare una linea esterna (chiamata puntone) renderà quella parte inflessibile / non flessibile.

L'abilitazione della linea esterna sinistra (puntone sinistro) non equivale all'abilitazione UIViewAutoresizingFlexibleRightMargin. Invece UIViewAutoresizingFlexibleRightMargin= on se il puntone destro è disabilitato, off se il puntone destro è abilitato.

All'inizio è abbastanza confuso, ma se vedi da vicino, c'è una differenza nelle molle e nei montanti. Non so perché Apple l'abbia fatto, ma per me ci sono stati alcuni casi in cui era più facile da usare. E l'utilizzo di proprietà opposte nel codice è ancora più confuso.


0

Swift 4 usa questo

gadBannerView?.autoresizingMask = [.flexibleRightMargin  , .flexibleLeftMargin , .flexibleTopMargin , .flexibleBottomMargin]

Objective-C

myView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin;
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.