web-dev-qa-db-fra.com

En utilisant redimensionnableImageWithCapInsets: l'image pour le bouton ne fonctionne pas

Lors de l'utilisation de resizableImageWithCapInsets: pour créer une image pour un UIButton, seul l'état normal (l'état défini pour l'image à l'aide de setBackgroundImage: forState :) fonctionne. Tous les autres états montrent un espace à la place de l'image dessinée. UIButton indique que si aucune image n'est définie pour un état particulier, l'image d'état normal sera utilisée avec une superposition pour les états désactivé et sélectionné.

Voici l'état normal:

enter image description here

Voici l'état sélectionné:

enter image description here

Et voici l'image source:

enter image description here

Il utilise clairement l'image redimensionnable que j'ai fournie, mais l'image ne dessine pas la zone redimensionnée. (Vous pouvez voir les bords gauche et droit, mais la zone centrale à étirer n'est tout simplement pas dessinée).

Fait intéressant, stretchableImageWithLeftCapWidth: topCapHeight: fonctionne. Il s’agit maintenant d’une méthode obsolète dans iOS 5, mais avec l’écart affiché dans la nouvelle API, je suis peut-être coincé à l’utiliser.

Je reconnais que je peux fournir plus d'images pour chaque État, mais cela va à l'encontre de l'objectif que je m'efforce d'atteindre: réduire l'encombrement de la mémoire et ajoute une dépendance supplémentaire à mon concepteur graphique, ce que j'aimerais éviter.

// This is the Gist of the code being used
UIImage* image = [UIImage imageNamed:@"button.png"];
UIEdgeInsets insets = UIEdgeInsetsMake(image.size.height/2, image.size.width/2, image.size.height/2, image.size.width/2);
image = [image resizableImageWithCapInsets:insets];
[self.button setBackgroundImage:image forState:UIControlStateNormal];
// Even doing the following results in the same behaviour
[self.button setBackgroundImage:image forState:UIControlStateSelected];
25
NSProgrammer

Vous ne créez pas vos encarts correctement pour le recouvrement d'image. J'ai reproduit votre problème et l'ai corrigé en utilisant les encarts corrects.

Avec votre code actuel, vous créez des majuscules de la moitié de la hauteur et de la largeur de l'image, ce qui vous laisse une zone "extensible" de 0x0 pixels. Vous n'avez donc rien au milieu.

Pourquoi cela n'apparaît-il pas comme étant erroné dans l'état normal du bouton? Je ne suis pas sûr. Peut-être qu'une optimisation est intégrée à UIButton afin de corriger les problèmes ou d'auto-structurer si vous ne fournissez pas d'image extensible, et cela n'est pas appliqué aux autres états. 

Les majuscules sont supposées définir la zone de l'image qui ne doit pas être étirée. Dans le cas de votre image button.png, il s’agit de 6 pixels à gauche et à droite et de 16 pixels en haut et en bas. Ce n'est pas tout à fait standard, vous devriez dire à votre graphiste que (du moins pour l'étirement gauche-droite, qui est l'étirement le plus courant), vous ne devriez avoir qu'une zone de 1px au centre, mais cela n'affecte pas le résultat. Si vous avez une zone extensible de 1px, vous pouvez normaliser votre code en déduisant les majuscules de la taille de l'image, comme vous avez essayé de le faire dans votre question (chaque majuscule est alors (image.size.height - 1) / 2 en haut/en bas, identique mais avec une largeur en gauche/droite. ).

Pour obtenir les images correctes sur votre bouton, utilisez le code suivant pour créer une image étirable:

UIEdgeInsets insets = UIEdgeInsetsMake(16, 6, 16, 6);
image = [image resizableImageWithCapInsets:insets];
34
jrturton

Je rencontrais aussi des problèmes lors de l’utilisation d’images redimensionnables sur iOS5. Il s'avère que si votre bouton est du type "RountedRect" et que vous manipulez les images d'arrière-plan, les images redimensionnables ne se comporteront pas comme prévu. (iOS6 résout le problème, probablement en supposant que vous avez le nouveau type de bouton et en effectuant les réglages nécessaires.)

0
MikecheckDev