2009-08-05 9 views
15

Así es como Soy la creación de la imagen de fondo y el modo de contenido:contenido UIButton es "centro", imagen de fondo es pixelada

[btn setBackgroundImage:[UIImage imageNamed:@"dots_game_horiz_blue.png"] 
       forState:UIControlStateNormal]; 
[btn setContentMode:UIViewContentModeCenter]; 

¿Hay una razón por la que la imagen de fondo se pixelada? El marco es un poco más grande que el tamaño de la imagen, y solo quiero que la imagen esté centrada.

+1

Lo sentimos, arrastrar a que desde el fondo del tiempo, pero hay una pérdida de memoria en allí, si no me equivoco. Sin lanzamiento para el alloc. –

+0

@Joseph, gracias por señalar eso. Actualicé el código. –

Respuesta

25

Creo que el UIButton no considera que una imagen de fondo sea "contenida", por lo que el modo de contenido no se aplicó a la imagen de fondo. En su lugar, me puse la imagen del botón y ha funcionado bien:

[btn setImage:[[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"dots_game_horiz_blue" ofType:@"png"]] forState:UIControlStateNormal]; 
[btn setContentMode:UIViewContentModeCenter]; 
+2

El problema con esta solución es que el UIButton tiene un margen interno, por lo que si la imagen no es lo suficientemente pequeña, se recortará, incluso si cabe dentro del botón. –

+3

Configurar el modo de contenido no está haciendo nada aquí.Las imágenes de los botones se centran automáticamente y no se cambian de escala. Intente configurarlo para todo menos centrado y vea lo que quiero decir. –

+2

+1 Sin embargo, desafortunadamente, si desea tener texto y una imagen, esto no funcionará :-( – Marc

5

También podría implementar - (CGRect)backgroundRectForBounds:(CGRect)bounds para controlar cómo se dibuja el fondo.

+3

Esto funcionó para mí. Realicé una clase UIButton personalizada, y utilicé este código para centrar la imagen: '- (CGRect) backgroundRectForBounds: (CGRect) límites { \t UIImage * bkgImage = [auto backgroundImageForState: self.state]; \t si (bkgImage) { \t \t CGFloat x = floorf ((self.bounds.size.width-bkgImage.size. ancho)/2); \t \t CGFloat y = floorf ((self.bounds.size.height-bkgImage.size.height)/2); \t \t return CGRectMake (x, y, bkgImage.size.width, bkgImage.size.height); \t} \t else return [super backgroundRectForBounds: bounds]; } ' –

+0

Solución" Overkill "imo. Simplemente puede establecer el marco para el botón como: UIImage * img = [UIImage imageNamed: @ "dots_game_horiz_blue.png"]; [btn setBackgroundImage: img forState: UIControlStateNormal]; btn.frame = CGRectMake (0, 0, img.size.width, img.size.height); – Tony

0

Necesitaba crear botones redondeados para las fotos de avatar y encontré las respuestas a esta pregunta para ayudar, pero no me dieron todo el camino hasta allí. Implementé el método backgroundRectForBounds y escalado la imagen para que se ajuste y funciona bien.

Tengo el código en GitHub.

https://github.com/brennanMKE/CircleButton

El método también se enumeran a continuación. Es importante establecer la imagen de fondo y no la imagen para el botón que no funciona con este método.

- (CGRect)backgroundRectForBounds:(CGRect)bounds { 
    UIImage *backgroundImage = [self backgroundImageForState:self.state]; 
    if (backgroundImage) { 
     CGFloat maxWidth = CGRectGetWidth(self.frame); 

     CGFloat xDelta = maxWidth/backgroundImage.size.width; 
     CGFloat yDelta = maxWidth/backgroundImage.size.height; 
     CGFloat delta = xDelta > yDelta ? xDelta : yDelta; 

     CGFloat x = floorf((self.bounds.size.width - (backgroundImage.size.width * delta))/2); 
     CGFloat y = floorf((self.bounds.size.height - (backgroundImage.size.height * delta))/2); 

     return CGRectMake(x, y, backgroundImage.size.width * delta, backgroundImage.size.height * delta); 
    } 
    else { 
     return [super backgroundRectForBounds:bounds]; 
    } 
} 
1

La solución correcta es cambiar el tipo de Sistema a Personal. Luego, la imagen de fondo respetará el tipo de contenido en lugar de solo centrarlo. En mi caso, configuré Aspect Fill y apliqué un radio de esquina de 45 grados para redondearlo. Simple y funciona a la perfección.

+0

Esto no funciona. Creé un nuevo botón personalizado y establecí su modo de contenido en Centro, pero aún así llena la imagen de fondo del tamaño de la vista. – devios1

11

En su xib/guión gráfico, en el inspector de atributos, es necesario:

  1. Indica tu tipo UIButton a Custom
  2. Indica tu imagen en la propiedad Image, no Background
  3. Validar el paso 2 , puede ver el marco del botón modificado de acuerdo con el conjunto de imágenes. Establece el cuadro como quiera que sea, la imagen cambiará de tamaño para caber en sí
  4. Seleccionar Image para la propiedad Edge con el fin de solicitar la inserción de la imagen del botón
  5. Introduzca profundidades de montaje que necesita. Si se establece a 5 Top, Bottom, Left, Right, la imagen se centra dentro del botón, con un borde de 5

Puede ver los cambios en la xib/vista de guión, no hay necesidad de poner en marcha una depuración.

Consejo: la inserción es el mismo para cada imágenes del botón (State Config)

+1

Cualquier cosa que comience con 'In your xib/storyboard' no es una solución para esta pregunta: D – Magoo

+0

Por ahora, la solución evolucionó. Puede omitir el paso 4 e ir con el paso 5 a través del inspector de tamaño (icono de regla). –

Cuestiones relacionadas