109 votes

UIButton de ne pas aller à l'Aspect Ajustement de l'iPhone

J'ai un couple UIButtons, et au bureau de l'IB ils sont définis à l'Aspect de la forme, mais pour une raison quelconque, ils sont toujours à l'étirement. Est-il autre chose que vous avez à régler? J'ai essayé tous les modes de vue différents, et aucun d'eux de travailler, ils ont tous de s'étirer.

239voto

Werner Altewischer Points 3439

La solution est de mettre la contentMode sur le imageView de la propriété de l' UIButton. L' UIButton a être créés avec un type personnalisé pour que cela fonctionne, je crois (sinon, nil est retourné pour cette propriété).

46voto

Dan Ray Points 14852

J'ai eu ce problème avant. Je l'ai résolu en mettant mon image dans un UIImageViewcontentMode paramètres de travail, et de mettre un transparent personnalisée UIButton sur le dessus de cela.

EDIT: Cette réponse est obsolète. Voir @Werner Altesischer réponse à la réponse correcte dans les versions modernes de iOS.

6voto

Alexander Wallin Points 849

Si vous placez l'image dans une UIImageView derrière le bouton, vous perdrez la fonctionnalité intégrée de l' UIButton classe, comme adjustsImageWhenHighlighted et adjustsImageWhenDisabled, et bien sûr la possibilité de définir des images différentes pour les différents états (sans le hazzle de le faire vous-même).

Si nous voulons avoir une image unstreched pour tous les états, l'un approuch est d'obtenir l'image à l'aide d' imageWithCGImage:scale:orientation, comme dans la méthode suivante:

- (UIImage *) getScaledImage:(UIImage *)img insideButton:(UIButton *)btn {

    // Check which dimension (width or height) to pay respect to and
    // calculate the scale factor
    CGFloat imgRatio = img.size.width / img.size.height, 
            btnRatio = btn.frame.size.width / btn.frame.size.height,
            scaleFactor = (imgRatio > btnRatio 
                           ? img.size.width / btn.frame.size.width
                           : img.size.height / btn.frame.size.height;

    // Create image using scale factor
    UIImage *scaledImg = [UIImage imageWithCGImage:[img CGImage]
                                             scale:scaleFactor
                                       orientation:UIImageOrientationUp];
    return scaledImg;
}

Pour mettre en œuvre cette nous écrire:

UIImage *scaledImg = [self getScaledImage:myBtnImg insideButton:myBtn];
[myBtn setImage:scaledImg forState:UIControlStateNormal];

Cela devrait permettre d'éviter l'image d'étirement dans tous les états. Il a travaillé pour moi, mais laissez-moi savoir si ce n'est pas!

REMARQUE: Ici, nous abordons un problème lié à l' UIButton, mais l' insideButton: pourrait tout aussi bien être insideView:, ou ce que l'on souhaite ajuster l'image à.

6voto

Joe Barbour Points 106

J'ai eu ce problème à un moment de retour. Le problème que j'ai eu était que j'essayais d'appliquer cet effet à l'arrière-plan UIButton qui est limitée et, par conséquent, vous ne pouvez l'ajuster comme facile.

L'astuce est de le définir comme une simple image, puis appliquer @ayreguitar technique et cela devrait résoudre le problème!

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setContentMode:UIViewContentModeScaleAspectFill];
[myButton setImage:@"myImage.png" forState:UIControlStateNormal];

2voto

Guillaume Points 11397

Cette réponse est fondée sur @WernerAltewischer de réponse.

Pour éviter de devoir brancher mon bouton à un IBOutlet pour exécuter le code, je sous-classé UIButton de la classe:

// .h
@interface UIButtonWithImageAspectFit : UIButton
@end

// .m
@implementation UIButtonWithImageAspectFit

- (void) awakeFromNib {
    [self.imageView setContentMode:UIViewContentModeScaleAspectFit];
}

@end



Maintenant créer un bouton personnalisé dans votre xib, et de définir son image (pas l'image d'arrière-plan):

UIButtonWithImageAspectFit: create and set image


Ensuite, définissez sa classe:

UIButtonWithImageAspectFit: set custom class

Vous avez terminé!
Au lieu de
UIButton without image aspect fit
votre bouton image de l'aspect ajustement est maintenant comme prévu:
UIButton with image aspect fit

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