web-dev-qa-db-fra.com

A quoi sert la propriété UIScrollView contentInset?

Quelqu'un peut-il m'expliquer à quoi sert la propriété contentInset d'une instance UIScrollView? Et peut-être donner un exemple?

153
ForeignerBR

Il définit la distance de l'encart entre la vue du contenu et la vue de défilement incluse. aScrollView.contentInset = UIEdgeInsetsMake(0, 0, 0, 7.0);

Voici un bon article de la bibliothèque de référence iOS sur les vues de défilement qui possède une capture d'écran informative (fig 1-3) - Je vais le répliquer via du texte ici:

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


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

La vue de défilement englobe la vue de contenu plus tout le remplissage fourni par les encarts de contenu spécifiés.

233
jball

Bien que la réponse de jball soit une excellente description des encarts de contenu, elle ne répond pas à la question de savoir quand l'utiliser. J'emprunterai à ses diagrammes:

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

C'est ce que vous obtenez lorsque vous le faites, mais son utilité ne s'affiche que lorsque vous faites défiler:

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

Cette ligne de contenu supérieure sera toujours visible car elle se trouve toujours dans le cadre de la vue de défilement. Une façon de penser au décalage supérieur est "de combien de décaler le contenu vers le bas dans la vue de défilement lorsque nous faisons défiler jusqu'en haut"

Pour voir un endroit où cela est réellement utilisé, consultez l'application Photos intégrée sur l'iphone. La barre de navigation et la barre d'état sont transparentes et le contenu de la vue de défilement est visible en dessous. En effet, le cadre de la vue de défilement s'étend aussi loin. Mais sans l'encadré de contenu, vous ne pourriez jamais avoir le haut du contenu bien dégagé de cette barre de navigation transparente lorsque vous irez jusqu'au sommet.

84
Fabian

Les encarts de contenu résolvent le problème du contenu inséré sous d'autres parties de l'interface utilisateur tout en restant accessible à l'aide de barres de défilement. En d'autres termes, l'objet de l'insert de contenu est de rendre l'aire d'interaction plus petite que son aire réelle.

Prenons le cas où nous avons trois zones logiques de l’écran:

TOP BUTTONS

TEXT

BOTTOM TAB BAR

et nous voulons que le texte n'apparaisse jamais sous les boutons TOP, mais nous souhaitons que le texte apparaisse sous la barre d'onglets inférieure tout en permettant le défilement afin de pouvoir mettre à jour le texte placé en transparence sous la barre d'onglets inférieure.

Ensuite, nous définirions l’origine Origin en dessous des boutons TOP et la hauteur de manière à inclure le bas de BOTTOM TAB BAR. Pour accéder au texte placé sous le contenu de BOTTOM TAB BAR, définissez l’encart du bas sur la hauteur de BOTTOM TAB BAR.

Sans l'encart, la molette ne vous permettrait pas de faire défiler le contenu suffisamment pour pouvoir y taper. Avec l'encart, c'est comme si le contenu avait en plus "BLANK CONTENT" la taille de l'encart de contenu. Le texte vierge a été "inséré" dans le "contenu" réel - c'est ainsi que je me souviens du concept.

8
Faisal Memon

Il est utilisé pour ajouter du rembourrage dans UIScrollView

Sans contentInset, une vue sous forme de tableau ressemble à ceci:

enter image description here

Puis définissez contentInset:

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

L'effet est comme ci-dessous:

enter image description here

Semble être mieux, non?

Et j'écris un blog pour étudier le contentInset, les critiques sont les bienvenues.

4
fujianjin6471

Excellente question.

Prenons l'exemple suivant (scroller est 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)];
}

Les incrustations sont le SEUL moyen de forcer votre curseur à avoir une "fenêtre" sur le contenu où vous le souhaitez. Je continue de jouer avec cet exemple de code, mais l’idée est là: utilisez les encarts pour obtenir une "fenêtre" sur votre UIScrollView.

2
Dan Rosenstark