web-dev-qa-db-fra.com

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:

  • Haut
  • La gauche
  • Bas
  • Droite

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

59
pmerino

Selon la documentation:

Vous utilisez cette méthode pour ajouter des incrustations dans une image ou pour modifier les incrustations existantes d'une image. Dans les deux cas, vous récupérez une nouvelle image et l'image d'origine reste intacte.

Lors du redimensionnement ou du redimensionnement de l'image, les zones couvertes par une casquette ne sont ni redimensionnées ni redimensionnées. Au lieu de cela, la zone de pixels non couverte par la coiffe dans chaque direction est mosaïque, de gauche à droite et de haut en bas, afin de redimensionner l'image. Cette technique est souvent utilisée pour créer des boutons de largeur variable, qui conservent les mêmes coins arrondis mais dont la zone centrale s’agrandit ou se rétrécit selon les besoins. Pour des performances optimales, utilisez une zone en mosaïque de 1x1 pixel.

Vous devez donc uniquement utiliser la quantité de pixels que vous souhaitez rendre non extensible dans les valeurs de la fonction UIEdgeInsetsMake.

Supposons que vous ayez une image de 21x50 points (21x50 pixels en définition standard, 42x100 pixels en définition Retina "@ 2x") et que vous vouliez que cette image soit extensible horizontalement, en maintenant les 10 points à gauche et à droite intacts lors de l'étirement. , mais n’étirez que sur la bande d’1 point au milieu. Ensuite, vous utiliserez UIEdgeInsetsMake(0,10,0,10).

Ne vous inquiétez pas du fait qu'ils sont flottants (c'est utile pour le redimensionnement des sous-pixels, par exemple, mais en pratique, vous n'utiliserez probablement que des entiers (ou des flottants sans parties décimales)

Attention, il s'agit d'une seule méthode iOS5 +, non disponible avant iOS5. Si vous utilisez un SDK antérieur à iOS5, utilisez stretchableImageWithLeftCapWidth:topCapHeight: au lieu.


[EDIT] Un conseil que j'utilise depuis un certain temps, car je ne me souviens jamais de l'ordre dans lequel les champs de la structure UIEdgeInsets sont - et dans quel ordre nous sommes supposés passer les arguments à UIEdgeInsetsMakefonction - je préfère utiliser la syntaxe "Désigné" comme ceci:

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

Ou quand un casting explicite est nécessaire:

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

Je le trouve plus lisible, surtout pour être sûr de ne pas mélanger les différentes frontières/directions!

70
AliSoftware

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

Ceci est une méthode d'instance UIImage. Donc, 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 incrustations Edge sont toutes égales à zéro, l'image sera mise en 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.

10
matt

Je viens de parcourir cet article qui a effacé tout mon concept concernant UIEdgeInsetsMake

iOS: Comment créer un bouton extensible avec UIEdgeInsetsMake

3
Azhar