Redimensionnement automatique des masques par programme vs Interface Builder / xib / nib

216

J'étais dans une hypothèse (probablement fausse) qu'activer l'indicateur de marge de droite dans xib équivaut à utiliser du UIViewAutoresizingFlexibleLeftMargincode interne et ainsi de suite.

Donc, je pensais en fonction de cet instantané: entrez la description de l'image ici

Plus tard dans la journée, j'ai dû recouper et suis tombé sur ce fil .

Et aussi la documentation Apple, intitulée avec la section intitulée "Gérer automatiquement les modifications de mise en page à l'aide des règles de redimensionnement automatique" dans ce lien: https://developer.apple.com/library/content/documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/CreatingViews/ CreatingViews.html

Donc, j'ai maintenant un concept renouvelé dans mon esprit quant à la façon dont la définition de masques de redimensionnement automatique par programme serait équivalente aux paramètres xib:

Scénario 1 : le paramètre uniquement (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)équivaut à:

(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)

Dans XIB?

Scénario 2 : La définition (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin)du code équivaut à:

(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin)

Dans XIB?

Mes 2 scénarios renouvelés sont-ils corrects? Suis-je en ce moment dans ma compréhension?

Raj Pawan Gumdal
la source
3
Tu te moques de moi? Mais il semble y avoir aussi ma confusion. Donc, si je veux étreindre le haut, j'active le redimensionnement automatique du bas. Bonne pomme de boulot. C'est la configuration la plus idiote que j'ai jamais vue.
user4951
1
Si vous voulez étreindre le sommet, vous devez vous assurer que vous ne mentionnerez pas UIViewAutoresizingFlexibleTopMargin dans le code de masque de bits. Mon hypothèse précédente était fausse et c'est pourquoi j'avais posté cette question pour effacer les choses.
Raj Pawan Gumdal
Votre hypothèse est correcte. Où vous trompez-vous?
user4951
Oui, les deux scénarios que vous citez sont corrects.
3
J'ai créé un outil simple pour cela: erkanyildiz.me/lab/autoresizingmask vous pouvez l'utiliser.
erkanyildiz

Réponses:

35

Oui, Interface Builder l'a "inversé" dans un sens (ou UIView, selon la façon dont vous le voyez). Vos "scénarios" cités sont corrects.

DarkDust
la source
47

Oui, vous avez correctement cité les choses. De plus, je conviens que cela semble un peu en arrière, donc pour cette raison, j'apprécie votre message.

Vous aimerez peut-être utiliser une macro de préprocesseur UIViewAutoresizingFlexibleMarginslors de la flexibilité d'une marge UIView dans toutes les directions. J'ai mis cela dans le fichier d'en-tête précompilé pour qu'il soit inclus partout.

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

L'utilisation UIViewAutoresizingFlexibleMarginspermet à un élément d'interface utilisateur de rester centré, car il n'embrassera aucun côté. Pour faire croître / rétrécir l'élément avec son parent, définissez respectivement UIViewAutoresizingFlexibleWidthet UIViewAutoresizingFlexibleHeight.

J'aime utiliser UIViewAutoresizingFlexibleMarginsparce que je pourrai le référencer plus tard comme:

myView.autoresizingMask = UIViewAutoresizingFlexibleMargins;

au lieu de

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

Tous trop souvent, je vois ces marges OU ensemble sur une seule ligne comme l'exemple ci-dessus. Difficile à lire.

Sam
la source
4
Flexible dans toutes les directions devrait être (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight) Je suppose? Ou suis-je encore confus!
Raj Pawan Gumdal
4
FlexibleMargins fera en sorte que l'élément reste centré (sans serrer la marge gauche, supérieure, droite ou inférieure). La largeur / hauteur flexible fera respectivement croître / rétrécir l'élément ui.
Sam
4
Est-ce que tout est clair maintenant? De plus, je le pensais vraiment quand j'ai dit que j'avais apprécié votre message. En fait, je l'ai favorisé car cela m'a dérouté dans le passé. Je pense que c'est un grand Q.
Sam
3
Oui, merci, maintenant je comprends, "Marges flexibles" et "Largeur / hauteur flexible". Cela explique tout, et votre "ne pas serrer la marge gauche, supérieure, droite ou inférieure" est une bonne façon d'expliquer :)
Raj Pawan Gumdal
0

entrez la description de l'image ici

L'activation de la flèche verticale / horizontale (appelée ressort) à l'intérieur de la boîte rendra la hauteur / largeur flexible. Mais l'activation d'une ligne extérieure (appelée entretoise) rendra ce côté inflexible / non flexible.

L'activation de la ligne extérieure gauche (jambe gauche) n'est pas équivalente à l'activation UIViewAutoresizingFlexibleRightMargin. Au lieu de cela, UIViewAutoresizingFlexibleRightMargin= sur si jambe droite désactivé, hors si jambe droite activée.

C'est assez déroutant au début, mais si vous regardez de près, il y a une différence entre les ressorts et les jambes de suspension. Je ne sais pas pourquoi Apple a fait cela, mais pour moi, il y avait des cas où c'était plus facile à utiliser. Et l'utilisation de propriétés opposées dans le code est encore plus déroutante.

Abdurrahman Mubeen Ali
la source
0

Swift 4 utilise ceci

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

Objectif c

myView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin;
Muhammad Nayab
la source