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?
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);
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
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.
Heres la Swift version:
myButton.imageEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
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
.
Swift 3:
button.setImage(UIImage(named: "checkmark_white"), for: .normal)
button.contentVerticalAlignment = .fill
button.contentHorizontalAlignment = .fill
button.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10)
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
)
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)
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 car ABS(100 - (40 + 40)) = ABS(100 - (60 + 60))
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)
mise à jour pour Swift 3
yourButtonName.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10)
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)
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!
}
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.