2010-05-27 9 views
9
UIImage *aImage = [[UIImage imageNamed:@"Gray_Button.png"] stretchableImageWithLeftCapWidth:25 topCapHeight:0]; 

Tratando de hacer un "botón de píldora de vidrio".iPhone stretchableImageWithLeftCapWidth solo hace "D" s

¿Qué significa "estirar" si la imagen es más grande ... y el botón que estoy tratando de usar en ... es más pequeño?

¿La imagen se 'estira' y 'contrae'?

La razón por la que pregunto ... es porque todas mis imágenes tienen el aspecto de una "D".

El lado izquierdo está cuadrado ... y el lado derecho es redondeado.

¿Qué le diría una forma de D que estoy haciendo mal? Demasiado ... o muy poco ... "leftCap setting"? ¿Demasiado grande una imagen?

Respuesta

54

Una imagen estirable se divide en 9 partes, si ambas leftCapWidth y son distintas de cero.

 leftCapWidth 
     <-----> 
     +--------------+^
     |  | |  | | 
     | A | | B | | topCapHeight 
     |-----+·+------| v 
     |-----+·+------| 
     | C | | D | 
     |  | |  | 
     +--------------+ 

Las partes centrales son siempre 1 px en tamaño, y esta es la parte que se estira, por ejemplo:

 leftCapWidth (constant!) 
     <-----> 
     +------------------+^
     |  |  |  | | 
     | A |  | B | | topCapHeight (constant!) 
    v |-----+ - - +------| v 
    | |  .  .  | 
    | |  .  .  | 
    ^|-----+ - - +------| 
     | C |  | D | 
     |  |  |  | 
     +------------------+ 
      >-----< 
     stretched region 

para crear un "botón de cristal de la píldora", usted debe llenar el redondeado entre las regiones A, B, C y D anteriores, y suministre el radio de esa píldora tanto en el leftCapWidth como en el .


Además, una imagen estirable es no contraıbles. Si intenta usar imágenes extensibles más grandes que los botones (o cualquier otra cosa) a la que desee aplicarlas, es posible que se muestren incorrectamente (especialmente en iOS más antiguas).

+0

Entonces un valor de 0 significa "no estirar nada" o "estirar uniformemente en toda la imagen"? No puedo ver nada que pueda causar un problema de "D". Supongo que lo primero que debo hacer es asegurar que CADA imagen sea más pequeña que CADA botón. (Si no ... entonces, ¿qué sucede?¿La imagen solo se usa "tal cual"? ¿Y qué pasa con los tramos de valor límite que no sucederán?) – Susanna

+0

@Roberta: 0 significa "estirar uniformemente en toda la imagen". Si la imagen es más pequeña, las esquinas se superpondrán entre sí. – kennytm

+1

La ilustración es realmente útil. – nonamelive

3

stretchableImageWithLeftCapWidth no se comporta como era de esperar. Sugiero usar la propiedad contentStretch de UIView para ahorrarse algo de frustración.

FYI, el camino es stretchableImage comporta:

  • si achica la imagen, sólo clips de las partes superior e izquierdo de la imagen, más que nada estiramiento.
  • si expande la imagen, expandirá solo la columna de píxeles justo debajo de la tapa superior y la fila de píxeles justo a la derecha de la tapa izquierda. Esto funciona para gráficos muy simples pero parecerá incómodo para cualquier gráfico que tenga efectos como sombreado o brillo.

contentStretch, por otro lado, se comporta como cabría esperar. El gráfico básicamente se divide en 9 partes que se expanden Y CONTRATAN de la forma en que Kenny explicó.

Además, no olvide que cada vez que estire una vista, su contentMode debe establecerse en UIViewContentModeScaleToFill.

+0

Esto no es cierto. Como explicó @KennyTM, no se CONTRALAN de esa manera: los límites no se respetan si la imagen debe reducirse a escala. –

Cuestiones relacionadas