A cosa serve la proprietà contentInset di UIScrollView?


158

Qualcuno può spiegarmi a cosa serve la proprietà contentInset in UIScrollViewun'istanza? E forse fornire un esempio?

Risposte:


240

Imposta la distanza dell'inserzione tra la vista contenuto e la vista di scorrimento inclusa.

Obj-C

aScrollView.contentInset = UIEdgeInsetsMake(0, 0, 0, 7.0);

Swift 5.0

aScrollView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 7.0)

Ecco un buon articolo della libreria di riferimento iOS sulle viste di scorrimento che ha uno screenshot informativo (fig 1-3): lo replicherò via testo qui:

  _|←_cW_→_|_↓_
   |       | 
---------------
   |content| ↑
 ↑ |content| contentInset.top
cH |content|
 ↓ |content| contentInset.bottom
   |content| ↓
---------------
  _|_______|___ 
             ↑


   (cH = contentSize.height; cW = contentSize.width)

La vista di scorrimento racchiude la vista del contenuto più qualsiasi imbottitura fornita dagli inserti del contenuto specificati.


viene utilizzato per aggiungere un'imbottitura a UIScrollView allora? Altrimenti potresti darmi un esempio pratico. Il mio problema non è come implementarlo ma quando implementarlo.
ForeignerBR,

28
Sì, riempie il contenuto all'interno della vista di scorrimento. È simile alla paddingproprietà CSS .
Marc W

Scusatemi sulle spalle di questo, posso spostarlo su una sua domanda, ma in base a questo, cosa succede realmente se impostate ciascun contenutoInset value su 0 diverso da contentHeight per esempio? Ciò impone che l'intera vista di scorrimento sia l'altezza su cui l'hai impostata?
Jakev,

@jakev No, la proprietà .frame controlla le dimensioni dello scrollview all'interno del suo genitore (Vedi questa risposta: stackoverflow.com/questions/5361369/… ). Impostando contentInsets su 0 per tutti i lati significa semplicemente che il contenuto non verrà affatto inserito nella vista di scorrimento. Quindi, quando si scorre verso l'alto, il contenuto si trova proprio nella parte superiore della vista di scorrimento. Se scorri verso il basso, il contenuto arriva fino in fondo alla vista di scorrimento.
Jeremy Wiebe,

è possibile mantenere contentInset sempre anche durante lo scrolling tenere sempre la marin top (contenInset) di scrollView
Chlebta,

86

Mentre la risposta di jball è un'eccellente descrizione delle inserzioni di contenuto, non risponde alla domanda su quando usarla. Prenderò in prestito dai suoi diagrammi:

  _|←_cW_→_|_↓_
   |       | 
---------------
   |content| ↑
 ↑ |content| contentInset.top
cH |content|
 ↓ |content| contentInset.bottom
   |content| ↓
---------------
   |content|    
-------------↑-

Questo è ciò che ottieni quando lo fai, ma l'utilità di esso mostra solo quando scorri:

  _|←_cW_→_|_↓_
   |content| ← content is still visible
---------------
   |content| ↑
 ↑ |content| contentInset.top
cH |content|
 ↓ |content| contentInset.bottom
   |content| ↓
---------------
  _|_______|___ 
             ↑

Quella riga superiore di contenuto sarà comunque visibile perché è ancora all'interno del riquadro della vista di scorrimento. Un modo di pensare all'offset superiore è "quanto spostare il contenuto verso il basso nella vista di scorrimento quando siamo fatti scorrere verso l'alto"

Per vedere un luogo in cui questo viene effettivamente utilizzato, guarda l'app Foto incorporata sull'iPhone. La barra di navigazione e la barra di stato sono trasparenti e il contenuto della vista di scorrimento è visibile sotto. Questo perché la cornice della vista di scorrimento si estende così lontano. Ma se non fosse per l'inserzione del contenuto, non saresti mai in grado di avere la parte superiore del contenuto chiara quella barra di navigazione trasparente quando vai fino in cima.


La cosa bella qui è che puoi usare gli inserti per creare l'effetto "scorri sotto la barra di stato con sfocatura".
TheEye,

L'esempio sull'app per le foto era facile da capire.
abhimuralidharan,

8

Le inserzioni di contenuto risolvono il problema di disporre di contenuti che si trovano al di sotto di altre parti dell'interfaccia utente e rimangono comunque raggiungibili utilizzando le barre di scorrimento. In altre parole, lo scopo dell'inserzione contenuto è rendere l'area di interazione più piccola della sua area effettiva.

Considera il caso in cui abbiamo tre aree logiche dello schermo:

TOP BUTTONS

TEXT

BOTTOM TAB BAR

e vogliamo che il TESTO non appaia mai in modo trasparente sotto i PULSANTI SUPERIORI, ma vogliamo che il Testo appaia sotto la BARRA DI SCHEDA INFERIORE e tuttavia consentiamo ancora lo scorrimento in modo da poter aggiornare il testo in modo trasparente sotto la BARRA DI SCHEDA INFERIORE.

Quindi impostiamo l'origine superiore in modo che si trovi al di sotto dei PULSANTI SUPERIORI e l'altezza includa la parte inferiore della TAB BAR BOTTOM. Per ottenere l'accesso al testo che si trova sotto il contenuto di TAB BAR BOTTOM, impostare l'inserto inferiore in modo che sia l'altezza del TAB BAR BOTTOM.

Senza l'inserzione, lo scroller non ti permetterebbe di scorrere il contenuto abbastanza da digitarlo. Con l'inserzione, è come se il contenuto avesse "CONTENUTO IN BIANCO" extra la dimensione dell'inserzione del contenuto. Il testo vuoto è stato "inserito" nel vero "contenuto" - è così che ricordo il concetto.


4

È usato per aggiungere imbottitura UIScrollView

Senza contentInset, una vista tabella è così:

inserisci qui la descrizione dell'immagine

Quindi impostare contentInset:

tableView.contentInset = UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0)

L'effetto è il seguente:

inserisci qui la descrizione dell'immagine

Sembra essere migliore, vero?

E scrivo un blog per studiare contentInset, le critiche sono benvenute.


2

Ottima domanda

Considera il seguente esempio ( scrollerè un UIScrollView):

float offset = 1000;
[super viewDidLoad];
for (int i=0;i<500; i++) {
    UILabel *label = [[[UILabel alloc] initWithFrame:CGRectMake(i * 100, 50, 95, 100)] autorelease];
    [label setText:[NSString stringWithFormat:@"label %d",i]];
    [self.scroller addSubview:label];
    [self.scroller setContentSize:CGSizeMake(self.view.frame.size.width * 2 + offset, 0)];
    [self.scroller setContentInset:UIEdgeInsetsMake(0, -offset, 0, 0)];
}

Le inserzioni sono l'UNICO modo per forzare il tuo scroller ad avere una "finestra" sul contenuto dove lo desideri. Sto ancora scherzando con questo codice di esempio, ma l'idea è lì: usa gli inserti per ottenere una "finestra" sul tuo UIScrollView.

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.