2012-05-14 17 views
89

¿Cómo puedo ajustar el tamaño de imagen del UIButton? Estoy instalando la imagen como esta:Cómo ajustar el tamaño de imagen de UIButton?

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

Sin embargo, esta imagen se llena hasta el botón por completo, ¿cómo puedo hacer la imagen más pequeña?

+5

¿Has intentado hacer la imagen más pequeña (LOL)? – CodaFi

+1

@CodaFi tiene razón, generalmente debe proporcionar activos en el tamaño correcto, ya que reduce el trabajo para la CPU, utiliza menos memoria y es probable que se vea mejor ya que no puede introducir ningún artefacto de escalado ... –

+0

También puede hacer el botón para el tamaño de la imagen (o viceversa). ¿Por qué tener un botón grande ... con una imagen pequeña en él? Simplemente agregue la imagen que desea, para eso están los botones personalizados o puede explicar la lógica que quiero implementar para que otros tengan una idea clara. –

Respuesta

150

Si entiendo correctamente lo que intenta hacer, debe jugar con los botones borde de la imagen. Algo así como:

myLikesButton.imageEdgeInsets = UIEdgeInsetsMake(top, left, bottom, right); 
-6

creo, el tamaño de la imagen también es el mismo que el tamaño de botón a continuación, poner una imagen de fondo del botón como:

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

que mástil tienen un mismo tamaño de la imagen y el botón. Espero que entiendas mi punto.

16

puede usar imageEdgeInsets propiedad Los márgenes insertados o iniciales para el rectángulo alrededor de la imagen del botón.

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

Un valor positivo se contrae, o inserciones, que se mueven en el borde. Un valor negativo expande, o inicia, ese borde.

63

La respuesta de Tim es correcta, sin embargo, quería agregar otra sugerencia, porque en mi caso había una solución más simple.

Estaba buscando establecer las inserciones de imagen UIButton porque no me di cuenta de que podía establecer el modo de contenido en el botón UIImageView, lo que habría evitado la necesidad de utilizar UIEdgeInsets y valores codificados por completo. Basta con acceder al imageview subyacente en el botón y establecer el modo de contenido:

myButton.imageView.contentMode = UIViewContentModeScaleAspectFit; 

Ver UIButton doesn't listen to content mode setting?

Swift 3

myButton.imageView?.contentMode = .scaleAspectFit 
+1

¿cómo hacer lo mismo para backgroundImage? –

+0

myButton.backgroundImageView? .contentMode = .scaleAspectFit –

+0

@ Andrea.Ferrando 'button.backgroundImageView.contentMode' no funciona –

11

Aquí está la versión Swift:

myButton.imageEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10) 
5

Con la ayuda de Tim C's answer, que fue capaz de crear una extensión en UIButton utilizando Swift que le permite especificar el marco de la imagen mediante el uso de la función .setImage() con un frame parámetro extra

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 
      ) 
     } 
    } 

} 

uso de este, si desea establecer el marco de una UIButton a CGRectMake(0, 0, 64, 64), y establecer la imagen de ella a myImage con un marco de CGRectMake(8, 8, 48, 48), podría utilizar

let button: UIButton = UIButton(frame: CGRectMake(0, 0, 64, 64)) 
button.setImage(
    myImage, 
    inFrame: CGRectMake(8, 8, 48, 48), 
    forState: UIControlState.Normal 
) 
+2

Debe' if let' en lugar de comprobar si 'frame' es' nil' y luego [force unwrapping a un billón de veces] (https://i.imgflip.com/utfq7.jpg). – fpg1503

10

también puede hacerlo desde constructor de interfaz gráfica como esta.

enter image description here

creo que es muy útil.

7

Si su imagen es demasiado grande (y no puede/no quiere hacer solo la imagen más pequeña), una combinación de las dos primeras respuestas funciona muy bien.

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

A menos que tengas las inserciones imagen justo, la imagen se inclinará sin cambiar el contentMode.

5

Swift 3:

button.setImage(UIImage(named: "checkmark_white"), for: .normal) 
button.contentVerticalAlignment = .fill 
button.contentHorizontalAlignment = .fill 
button.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10) 
1

Actualizado para Swift 3

yourButtonName.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10) 
1

Swift 3

puse anchura y la altura myButton a 40 y mi relleno de EdgeInsetsMake es de 15 todos los lados . Sugiero que agregue un color de fondo a su botón para ver el relleno real.

myButton.backgroundColor = UIColor.gray // sample color to check padding 
myButton.imageView?.contentMode = .scaleAspectFit 
myButton.imageEdgeInsets = UIEdgeInsetsMake(15, 15, 15, 15) 
Cuestiones relacionadas