web-dev-qa-db-fra.com

Étirer l'image d'arrière-plan pour UIButton

J'ai une texture vraiment plus courte que mon UIButton.

J'ai cette texture:

enter image description here

Et je devrais créer ce bouton:

enter image description here

Comment devrais-je étirer (pas carreler) cette texture? Étirement dans le sens horizontal

Thnx

34
Eugene Trapeznikov

D'après les exemples d'images que vous avez fournis, je suis presque sûr que vous recherchez les UIImageresizableImageWithCapInsets:

UIImage *originalImage = [UIImage imageNamed:@"myImage.png"];
UIEdgeInsets insets = UIEdgeInsetsMake(top, left, bottom, right);
UIImage *stretchableImage = [originalImage resizableImageWithCapInsets:insets];
[myButton setBackgroundImage:stretchableImage forState:UIControlStateNormal];
// the image will be stretched to fill the button, if you resize it.

Les valeurs de la structure UIEdgeInsets déterminent les marges que vous ne souhaitez pas étirer. Vos valeurs gauche et droite pourraient être à peu près aussi larges:

enter image description here

Les valeurs supérieures et inférieures peuvent être soit 0 (si vous ne voulez pas redimensionner le bouton verticalement), soit probablement la moitié de la hauteur totale.

70
DrummerB

Avec Xcode 6 (et iOS7 + cible), vous pouvez utiliser l'éditeur de découpage lorsque vous travaillez avec des ressources d'images. Basculez en mode de découpage avec Editeur -> Afficher le menu de découpage ou appuyez sur Afficher le découpage bouton lorsque vous sélectionnez une image spécifique avec l'éditeur (illustré ci-dessous).

Show Slicing button

Ensuite, vous pouvez sélectionner l'image pour une échelle d'affichage spécifique et faire glisser les règles ou modifier manuellement les valeurs des encarts.

Rules

Après cela, vous pouvez sélectionner cette image dans Interface Builder pour UIButton Image d'arrière-plan (La représentation du bouton IB peut sembler mauvaise, mais elle devrait être correcte lors de l'exécution).

Mes boutons semblent bien (exécutant le simulateur iOS 7.1 et le périphérique iOS 8).

enter image description here

Cela Apple doc link pourrait être utile.

38
Anton Gaenko

En ne carrelant pas, je suppose que vous ne pouvez donc pas utiliser

- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets

La façon de faire ce que vous voulez est d'utiliser:

UIGraphicsBeginImageContextWithOptions(newSize, NO, 0); // should be proportionally larger
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextDrawImage(context, (CGRect){{0,0}, newSize}, [yourImage CGImage]);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
3
David H

Ou en utilisant Images extensibles:

UIImage* imgbkg =[[UIImage imageNamed: @"my_bkg_image.png"] stretchableImageWithLeftCapWidth:10 topCapHeight:10];

[_button setBackgroundImage: imgbkg forState: UIControlStateNormal];

Utilisez si vous ne voulez pas étirer certains côtés.

1
htafoya

Utilisation stretchableImageWithLeftCapWidth:topCapHeight: méthode.

Se référer: https://github.com/boctor/idev-recipes/tree/master/StretchableImages

1
jki