60 votes

Comment fonctionne UIEdgeInsetsMake?

Je crée une application où j'utilise UIEdgeInsetsMake pour resizableImageWithCapInsets , mais je ne comprends pas comment ça fonctionne exactement. UIEdgeInsetsMake a 4 arguments:

  • Bas
  • Haut
  • La gauche
  • Droite

Mais comme ils sont flottants, je ne sais pas comment définir cela en image, merci! :RÉ

70voto

AliSoftware Points 21493

Selon la documentation:

Vous utilisez cette méthode pour ajouter de la pac encarts à une image ou à modifier le cap des encarts d'une image. Dans les deux cas, vous recevez en retour une nouvelle image et de l'image d'origine reste intacte.

Pendant la mise à l'échelle ou le redimensionnement de l'image, les zones couvertes par un pac ne sont pas mis à l'échelle ou redimensionnées. Au lieu de cela, la zone de pixels ne sont pas couverts par la pac dans chaque direction est carrelé, de gauche à droite et de haut en bas, pour redimensionner l'image. Cette technique est souvent utilisée pour créer une variable de la largeur des boutons, qui conservent les mêmes coins arrondis mais dont le centre de la région augmente ou réduit en tant que de besoin. Pour de meilleures performances, utilisez une surface carrelée qui est une 1x1 pixel de la zone de la taille.

Donc, vous ne devez utiliser le montant de pixels que vous voulez faire unstretchable dans les valeurs de l' UIEdgeInsetsMake fonction.

Disons que vous avez une image de 21x50 points (21x50 pixels en définition standard, 42x100 pixels dans la Rétine "@2x" définition) et que vous voulez cette image pour être extensible horizontalement, en gardant les 10 points sur la gauche et sur la droite intacte lors de l'étirement de l'image, mais seulement s'étirer le 1-point-large bande dans le milieu. Ensuite, vous utiliserez UIEdgeInsetsMake(0,10,0,10).

Ne vous embêtez pas qu'ils sont des flotteurs (c'est utile pour subpixelling redimensionnement par exemple, mais dans la pratique, vous devrez probablement utiliser des entiers (ou de flotteurs avec pas de parties décimales)

Attention, c'est un iOS5+ seule méthode, pas disponible avant iOS5 (en fait ne devrait pas poser à ce sujet ici car c'est encore sous NDA). Si vous utilisez des pré-iOS5 SDK, utilisez stretchableImageWithLeftCapWidth:topCapHeight: à la place.


[MODIFIER] astuce j'utilise depuis un certain temps, comme je ne me souviens jamais de l'ordre dans lequel les champs de l' UIEdgeInsets de la structure et de l'ordre dans lequel nous sommes censés passer les arguments à l' UIEdgeInsetsMake - fonction, je préfère utiliser le "désigné inits" la syntaxe ressemble à ceci:

UIEdgeInsets insets = { .left = 50, .right = 50, .top = 10, .bottom = 10 };

Ou quand un cast explicite est nécessaire:

UIImage* rzImg = [image resizableImageWithCapInsets:(UIEdgeInsets){
   .left = 50, .right = 50,
   .top = 10, .bottom = 10
}];

Je trouve ça plus lisible, surtout pour être sûr que nous ne mélangez pas différentes frontières/les directions!

10voto

matt Points 60113

Mais ils sont flottants, donc je ne sais pas comment définir cela en image

Ceci est une méthode d'instance UIImage. Ainsi, la façon dont vous utilisez resizableImageWithCapInsets pour créer dans une image est de commencer par envoyer ce message à une image (un UIImage).

Nouvelle fonctionnalité intéressante: notez que si les encarts de bord sont tous nuls, l'image sera mosaïque. Cela fonctionne comme arrière-plan pour tout ce qui accepte une image d'arrière-plan. Cela fonctionne même dans un UIImageView.

3voto

Azhar Points 6800

Je viens de passer en revue cet article qui a effacé tout mon concept concernant UIEdgeInsetsMake

iOS: Comment créer un bouton extensible avec UIEdgeInsetsMake

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X