Comment puis-je ajuster la taille de l'image de l'UIButton? Je règle l'image comme ceci:
[myLikesButton setImage:[UIImage imageNamed:@"icon-heart.png"] forState:UIControlStateNormal];
Cependant, cela remplit l'image jusqu'au bouton complet, comment puis-je réduire la taille de l'image?
Si je comprends bien ce que vous essayez de faire, vous devez jouer avec les boutons image Encadré. Quelque chose comme:
myLikesButton.imageEdgeInsets = UIEdgeInsetsMake(top, left, bottom, right);
La réponse de Tim est correcte, mais je souhaitais ajouter une autre suggestion car, dans mon cas, il y avait une solution plus simple.
Je cherchais à définir les incrustations d'image UIButton
, car je n'avais pas réalisé que je pouvais définir le mode de contenu sur le bouton UIImageView
, ce qui aurait évité d'utiliser UIEdgeInsets et des valeurs codées en dur. . Accédez simplement à la vue d'image sous-jacente sur le bouton et définissez le mode contenu:
myButton.imageView.contentMode = UIViewContentModeScaleAspectFit;
Voir IButton n'écoute pas le réglage du mode contenu?
Swift 3
myButton.imageView?.contentMode = .scaleAspectFit
Swift 3:
button.setImage(UIImage(named: "checkmark_white"), for: .normal)
button.contentVerticalAlignment = .fill
button.contentHorizontalAlignment = .fill
button.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10)
vous pouvez utiliser la propriété imageEdgeInsets
Les marges d’encadrement ou de sortie du rectangle autour de l’image du bouton.
[self.btn setImageEdgeInsets:UIEdgeInsetsMake(6, 6, 6, 6)];
Une valeur positive réduit ou insère ce Edge en mouvement. Une valeur négative développe ou confine ce bord.
Si votre image est trop grande (et que vous ne pouvez pas/ne voulez pas simplement réduire l'image), une combinaison des deux premières réponses fonctionne à merveille.
addButton.imageView?.contentMode = .scaleAspectFit
addButton.imageEdgeInsets = UIEdgeInsetsMake(15.0, 15.0, 15.0, 5.0)
À moins que les encarts d'image soient corrects, l'image sera biaisée sans changer le paramètre contentMode
.
Voici la version Swift:
myButton.imageEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
Swift 4
Vous devrez utiliser ces deux lignes de code, dans cet ordre spécifique. Tout ce dont vous avez besoin est de changer les valeurs supérieure et inférieure des incrustations Edge.
addButton.imageView?.contentMode = .scaleAspectFit
addButton.imageEdgeInsets = UIEdgeInsetsMake(10.0, 0.0, 10.0, 0.0)
Avec l'aide de réponse de Tim C , j'ai pu créer une extension sur UIButton
à l'aide de Swift qui vous permet de spécifier le cadre de l'image à l'aide de la .setImage()
fonction avec un paramètre supplémentaire frame
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 cela, si vous voulez définir le cadre d'un UIButton
sur CGRectMake(0, 0, 64, 64)
, et définir l'image de celle-ci sur 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
)
Lorsque vous modifiez la taille de l'icône avec UIEdgeInsetsMake(top, left, bottom, right)
, gardez à l'esprit les dimensions des boutons et la capacité de UIEdgeInsetsMake à utiliser des valeurs négatives comme si elles étaient positives.
Exemple: Deux boutons de hauteur 100 et d’aspect 1: 1.
left.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
right.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
left.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
right.imageEdgeInsets = UIEdgeInsetsMake(45, 0, 45, 0)
left.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
right.imageEdgeInsets = UIEdgeInsetsMake(60, 0, 60, 0)
Les exemples 1 et 3 sont identiques puisque ABS (100 - (40 + 40)) = ABS (100 - (60 + 60))
Une approche consiste à redimensionner UIImage dans le code comme suit. Remarque: ce code est uniquement mis à l'échelle par la hauteur, mais vous pouvez également facilement ajuster la fonction à l'é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!
}
Swift 3
Je règle la largeur et la hauteur de myButton sur 40 et le remplissage de EdgeInsetsMake est de 15 sur tous les côtés. Je suggère d'ajouter une couleur de fond à votre bouton pour voir le remplissage actuel.
myButton.backgroundColor = UIColor.gray // sample color to check padding
myButton.imageView?.contentMode = .scaleAspectFit
myButton.imageEdgeInsets = UIEdgeInsetsMake(15, 15, 15, 15)
Mise à jour pour Swift
yourButtonName.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10)
Voici l'autre solution à l'échelle imageView of UIButton.
button.imageView?.layer.transform = CATransform3DMakeScale(0.8, 0.8, 0.8)