Comment ajuster l'image D'un UIButton?

Comment puis-je ajuster la taille de l'image de L'UIButton? Je mets l'image comme ceci:

 [myLikesButton setImage:[UIImage imageNamed:@"icon-heart.png"] forState:UIControlStateNormal];

Cependant, cela remplit l'image pour le bouton, comment puis-je faire la taille de l'image?

102
demandé sur jaysoifer 2012-05-14 05:25:22

14 réponses

si je comprends bien ce que vous essayez de faire, vous devez jouer avec les boutons Image edge inset. Quelque chose comme:

myLikesButton.imageEdgeInsets = UIEdgeInsetsMake(top, left, bottom, right);
174
répondu Tim C 2015-02-05 09:51:26

la réponse de Tim est correcte, cependant je voulais ajouter une autre suggestion, parce que dans mon cas il y avait une solution plus simple tout à fait.

je cherchais à régler les inserts d'image UIButton parce que je ne savais pas que je pouvais régler le mode contenu sur le bouton UIImageView , ce qui aurait évité la nécessité d'utiliser des inserts UIEdgeInsets et des valeurs codées. Il suffit d'accéder à l'imageview sous-jacente sur le bouton et de définir le mode contenu:

myButton.imageView.contentMode = UIViewContentModeScaleAspectFit;

Voir UIButton ne pas écouter du contenu du réglage de mode?

Swift 3

myButton.imageView?.contentMode = .scaleAspectFit
70
répondu Kyle Clegg 2017-05-23 12:18:16

vous pouvez utiliser imageEdgeInsets propriété Les marges d'insertion ou d'entrée pour le rectangle autour de l'image du bouton.

 [self.btn setImageEdgeInsets:UIEdgeInsetsMake(6, 6, 6, 6)];

une valeur positive rétrécit, ou insète, que le bord-se déplace. Une valeur négative se développe, ou dilate, ce bord.

21
répondu safaa elgendi 2013-08-16 19:18:38

Heres la Swift version:

myButton.imageEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
14
répondu Esqarrouth 2015-11-07 08:25:43

vous pouvez aussi faire cela de inteface builder comme ceci.

enter image description here

je pense que c'est utile.

12
répondu Milos Mandic 2016-11-14 10:05:39

si votre image est trop grande (et que vous ne pouvez pas/ne voulez pas simplement la rendre plus petite), une combinaison des deux premières réponses fonctionne très bien.

        addButton.imageView?.contentMode = .scaleAspectFit
        addButton.imageEdgeInsets = UIEdgeInsetsMake(15.0, 15.0, 15.0, 5.0)

sauf si vous obtenez les inserts d'image juste, l'image sera biaisée sans changer le contentMode .

10
répondu iosjillian 2017-02-07 19:16:56

Swift 3:

button.setImage(UIImage(named: "checkmark_white"), for: .normal)
button.contentVerticalAlignment = .fill
button.contentHorizontalAlignment = .fill
button.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10)
8
répondu Josh O'Connor 2017-05-05 18:39:50

avec l'aide de réponse de Tim C , J'ai pu créer une extension sur UIButton en utilisant Swift qui vous permet de spécifier le cadre de l'image en utilisant la fonction .setImage() avec un frame paramètre

extension UIButton{

    func setImage(image: UIImage?, inFrame frame: CGRect?, forState state: UIControlState){
        self.setImage(image, forState: state)

        if let frame = frame{
            self.imageEdgeInsets = UIEdgeInsets(
                top: frame.minY - self.frame.minY,
                left: frame.minX - self.frame.minX,
                bottom: self.frame.maxY - frame.maxY,
                right: self.frame.maxX - frame.maxX
            )
        }
    }

}

en utilisant ceci, si vous voulez mettre le cadre d'un UIButton à CGRectMake(0, 0, 64, 64) , et mettre l'image de celui-ci à myImage avec un cadre de CGRectMake(8, 8, 48, 48) , vous pouvez utiliser

let button: UIButton = UIButton(frame: CGRectMake(0, 0, 64, 64))
button.setImage(
    myImage,
    inFrame: CGRectMake(8, 8, 48, 48),
    forState: UIControlState.Normal
)
6
répondu Jojodmo 2017-05-23 12:34:38

lors du changement de la taille de l'icône avec UIEdgeInsetsMake(top, left, bottom, right) , gardez à l'esprit les dimensions des boutons et la capacité de UIEdgeInsetsMake de travailler avec des valeurs négatives comme si elles sont positives.

exemple: deux boutons de hauteur 100 et aspect 1: 1.

left.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
right.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)

enter image description here

left.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
right.imageEdgeInsets = UIEdgeInsetsMake(45, 0, 45, 0)

enter image description here

left.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
right.imageEdgeInsets = UIEdgeInsetsMake(60, 0, 60, 0)

enter image description here

les exemples 1 et 3 sont identiques car ABS(100 - (40 + 40)) = ABS(100 - (60 + 60))

3
répondu Borys Tkachenko 2018-05-04 23:03:09

Swift 4

Vous devez utiliser ces deux lignes de code, dans cet ordre précis. Tout ce que vous avez besoin est de changer la valeur supérieure et inférieure des inserts de bord.

addButton.imageView?.contentMode = .scaleAspectFit
addButton.imageEdgeInsets = UIEdgeInsetsMake(10.0, 0.0, 10.0, 0.0)
2
répondu Van Du Tran 2018-03-13 17:51:57

mise à jour pour Swift 3

yourButtonName.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10)
1
répondu iajmeri43 2017-08-19 06:17:26

Swift 3

j'ai mis la largeur et la hauteur de mon bouton à 40 et mon rembourrage de EdgeInsetsMake est de 15 tous les côtés. Je suggère d'ajouter une couleur de fond à votre bouton pour voir le rembourrage réel.

myButton.backgroundColor = UIColor.gray // sample color to check padding
myButton.imageView?.contentMode = .scaleAspectFit
myButton.imageEdgeInsets = UIEdgeInsetsMake(15, 15, 15, 15)
1
répondu Drey 2017-09-08 19:20:29

une approche consiste à redimensionner L'image en code comme suit. Note: ce code ne échelles de hauteur, mais vous pouvez facilement régler la fonction d'échelle par la largeur.

let targetHeight = CGFloat(28)
let newImage = resizeImage(image: UIImage(named: "Image.png")!, targetHeight: targetHeight)
button.setImage(newImage, for: .normal)

fileprivate func resizeImage(image: UIImage, targetHeight: CGFloat) -> UIImage {
    // Get current image size
    let size = image.size

    // Compute scaled, new size
    let heightRatio = targetHeight / size.height
    let newSize = CGSize(width: size.width * heightRatio, height: size.height * heightRatio)
    let rect = CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height)

    // Create new image
    UIGraphicsBeginImageContextWithOptions(newSize, false, 0)
    image.draw(in: rect)
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    // Return new image
    return newImage!
}
1
répondu Crashalot 2018-03-27 19:57:00

je pense, votre taille d'image est aussi la même que la taille de bouton puis vous mettez l'image en arrière-plan du bouton comme:

[myLikesButton setBackgroundImage:[UIImage imageNamed:@"icon-heart.png"] forState:UIControlStateNormal];

vous mât ont la même taille de l'image et le bouton.j'espère que vous comprenez mon point.

-4
répondu Dev 2012-05-14 05:51:32