2011-12-29 6 views
25

Al usar resizeImageWithCapInsets: para crear una imagen para un UIButton solo el estado normal (el estado establece la imagen usando setBackgroundImage: forState:) trabajos. Todos los demás estados muestran una brecha en lugar de la imagen dibujada. UIButton dice que si no se establece una imagen para un estado particular, la imagen de estado normal se usará con una superposición para los estados deshabilitados y seleccionados.Uso de resizeImageWithCapInsets: la imagen para el botón solo funciona para el estado establecido, otros estados muestran un "espacio"

Aquí es el estado normal:

enter image description here

Aquí es el estado seleccionado:

enter image description here

y aquí está la imagen de la fuente:

enter image description here

Está claramente usando la imagen de tamaño variable que proporcioné, pero la imagen no dibuja el área redimensionada. (Puede ver los bordes izquierdo y derecho, pero el área central que se va a estirar simplemente no está dibujada).

Curiosamente, stretchableImageWithLeftCapWidth: topCapHeight: funciona. Ahora bien, este es un método en desuso en iOS 5, pero con la brecha que se muestra en la nueva API, es posible que no pueda usarlo.

Reconozco que puedo proporcionar más imágenes para cada estado, pero eso frustra el propósito que estoy tratando de lograr de reducir la huella de memoria y agrega una dependencia adicional en mi diseñador gráfico que me gustaría evitar.

// This is the gist of the code being used 
UIImage* image = [UIImage imageNamed:@"button.png"]; 
UIEdgeInsets insets = UIEdgeInsetsMake(image.size.height/2, image.size.width/2, image.size.height/2, image.size.width/2); 
image = [image resizableImageWithCapInsets:insets]; 
[self.button setBackgroundImage:image forState:UIControlStateNormal]; 
// Even doing the following results in the same behaviour 
[self.button setBackgroundImage:image forState:UIControlStateSelected]; 
+0

Agregué el fragmento de código y organicé las capturas de pantalla (recortadas en el área pertinente, por supuesto) – NSProgrammer

+0

Esto es raro ... Me gustaría para ver button.png si pudiéramos. –

+0

http://i40.tinypic.com/ea35zq.png - Solo puedo agregar 2 enlaces a una publicación como nuevo usuario, pero aquí está el botón sourece.png – NSProgrammer

Respuesta

34

No está creando correctamente sus inserciones para la limitación de imagen. He reproducido tu problema y lo corrigí utilizando las inserciones correctas.

Con su código actual, crea capas de la mitad de la altura y el ancho de la imagen; esto le deja un área "estirable" de 0x0 píxeles, por lo que no obtendrá nada en el medio.

Por qué esto no se muestra como incorrecto en el estado normal del botón No estoy seguro - quizás hay alguna optimización incorporada en UIButton para arreglar cosas o auto-strectch si no proporciona un estiramiento imagen, y esto no se aplica a los otros estados.

Se supone que las tapas definen el área de la imagen que no se debe estirar. En el caso de su imagen button.png, esto es 6 píxeles en los lados izquierdo y derecho, y 16 píxeles en la parte superior e inferior. Esto no es del todo estándar, debe decirle a su diseñador gráfico que (al menos para la izquierda-derecha, que es el estiramiento más común) solo debe tener un área de 1px en el centro, sin embargo, esto no afecta el resultado. Si tiene un área estirable de 1px, puede estandarizar su código derivando los límites del tamaño de la imagen como lo ha intentado hacer en su pregunta (cada límite es entonces (image.size.height - 1)/2 para arriba/abajo, mismo pero con ancho para izquierda/derecha)

Para obtener las imágenes correctas en su botón, utilice el siguiente código para crear la imagen estirable:

UIEdgeInsets insets = UIEdgeInsetsMake(16, 6, 16, 6); 
image = [image resizableImageWithCapInsets:insets]; 
+0

+1 mi lógica definitivamente no dio cuenta de eso. Al truncar el valor del borde. 'truncf ((image.size.height - 1)/2.0)' mi imagen cambia de tamaño correctamente. Felicitaciones a jrturton – NSProgrammer

+1

Gran captura, debe tenerse en cuenta que iOS6 repetirá el píxel donde se encuentran las dos inserciones dando como resultado un error que parece un iOS 5. – tapi

0

que estaba experimentando problemas durante el uso de imágenes de tamaño variable en IOS5 también. Resulta que si su botón es de tipo "RountedRect" y manipula las imágenes de fondo, las imágenes redimensionables no se comportarán como se espera.(iOS6 maneja esto bien, presumiblemente asumiendo el nuevo tipo de botón y ajustándolo según sea necesario.)

+0

El problema descrito fue en un estilo de botón "Personalizado". – NSProgrammer

Cuestiones relacionadas