Tengo un UIButton con un determinado ancho de 200. Su autoresizingMask se establece la propiedad UIViewAutoresizingFlexibleWidth. Un UIImage se aplica a este botón backgroundImage de la propiedad. Este UIimage se define como sigue:

[[UIImage imageNamed:@"buttonimage.png"] stretchableImageWithLeftCapWidth:10 topCapHeight:0]

buttonimage.png tiene un ancho de 400px (2x ancho de botón, porque de retina) y representa un rectángulo redondeado. En el modo de retrato, todo está bien. Tan pronto como el usuario gira el dispositivo y el iPhone entra en modo horizontal, la UIButton se estira. Debido a este comportamiento, el de la izquierda borde redondeado de la imagen sigue siendo el mismo ( stretchableImageWithLeftCapWidth: ), pero las curvas a la derecha, también se estira. Es allí cualquier propiedad que se me olvidó poner que asegura que sólo uno de píxeles específico (por ejemplo, el décimo) se estira y nada retiene dimensiones?

Gracias de antemano!

Edit: Si yo uso una imagen más pequeña, que ya está estirada en el modo de retrato, tanto de las fronteras parecen ser ampliado.

Resuelto!
Si la imagen se llama «miimagen.png» y es la versión retina, sólo tiene que llamar a «[email protected]»

  • Usted debe proporcionar la buttonimage.png no retina tamaño y una segunda versión en la retina tamaño nombre [email protected]. Tal vez así se resuelve el problema.
  • Este comportamiento se produce tanto en un no-retina y una retina-resolución-dispositivos de apoyo. Y si lo entiendo correctamente, el [email protected] archivo es el único acceso por dispositivos con retina resolución, por lo que no hacen ninguna diferencia. Me corrija si estoy equivocado.
  • a la derecha. Yo he probado un simple ejemplo, y hay un efecto cómico, cuando me puse a la izquierda de la tapa para una pequeña cantidad como 3px unta esta parte a lo largo de todo el botón, y el resto se pinta correctamente alineados a la derecha. Tiene el mismo aspecto de paisaje. Mi botón de la imagen es de 50×50, cuando me puse a la izquierda de la tapa para 21px que es exactamente después de la vuelta a la esquina no se ve bien incluso en el paisaje. Tal vez algo de prueba y error va a hacer?
  • He añadido ahora un no-retina versión de mi botón y de repente funcionó. Gracias.
InformationsquelleAutor fscheidl | 2011-04-23

2 Comentarios

  1. 5

    Hay alguna propiedad que me olvidó poner
    que asegura que sólo uno de píxeles especificado
    (por ejemplo, el décimo) se estira y
    otra cosa retiene dimensiones?

    No, realmente no, pero dado el tamaño de sus imágenes, es una re-lectura de la leftCapWidth propiedad.

    La manera estirable imágenes de trabajo es: proporcionar la izquierda de la tapa, el siguiente píxel se estira, y el lado derecho de la imagen con width = (total width - left cap + 1) estancias de la misma. Dado que se ajuste a la izquierda de la pac a 10, y la imagen original es de 400, le está diciendo a iOS que el derecho no estirable lado derecho de la imagen es 400-10-1=389px. La misma cosa se aplica verticalmente. Comprueba si estás utilizando @2x imágenes en un dispositivo normal sin un @2x en su nombre, o si las 2 versiones no tienen exactamente el doble de píxeles, o hay una mayúscula/minúscula diferencia. Usted puede encontrar esto nslogging el tamaño de la imagen cargada.

    No sé por qué el lado derecho de la imagen se estira. Dado que usted tiene height=0, toda la imagen se estira verticalmente si el botón de cambios de altura, pero es probable que esto provoque una distorsión de sólo el lado derecho.

    • He añadido ahora un no-retina versión de mi botón y de repente funcionó. Usted me ha guiado por el camino correcto.
  2. 2

    No hay nada de malo con su código como lo que yo puedo decir, que debe estar causando el lado derecho de la imagen recortada. A continuación está el código exacto que yo uso, que sé que funciona, para producir el mismo efecto que estás buscando.

    UIButton *button=[[UIButton alloc] initWithFrame:CGRectMake(0, 0, 245, 51)];
    button.autoresizingMask=UIViewAutoresizingFlexibleWidth;
    [button setBackgroundImage:[[UIImage imageNamed:@"userbubble.png"] stretchableImageWithLeftCapWidth:40 topCapHeight:0] forState:UIControlStateNormal];
    [self.view addSubview:button];

    Mi conjetura es que el problema viene desde el png que estás usando, o posiblemente de la Compress PNG Archivos de configuración de su proyecto. También, ya que la imagen que usted está usando es tan grande, intenta poner a la izquierda de la pac más, dicen que 40 o 50 píxeles.

    • Este es el código exacto que yo uso. Acabo de probar con una imagen más pequeña y, extrañamente, ambos bordes son ligeramente estirado. (Tanto en modo horizontal y vertical)
    • Trate de darse un mayor izquierdo de la tapa (por ejemplo, un 50% de la imagen), y si las cosas se ven de raro de verificación Comprimir los Archivos PNG en su aplicación de destino & configuración del proyecto. Desactivarlo y ver si eso hace la diferencia.
    • Trató de ambas opciones. Todavía no hay ninguna diferencia. He subido mi buttonimage. Tal vez usted detectar cualquier diferencia entre su userbubble.png y mi imagen. (sonrisa)
    • He añadido el botón a mi proyecto de xcode, y funcionó perfectamente bien, así que el problema debe venir de algún otro lugar. UIButton *button=[[UIButton alloc] initWithFrame:CGRectMake(10, 10, 91, 86)]; [button setBackgroundImage:[[UIImage imageNamed:@"buttonImage.png"] stretchableImageWithLeftCapWidth:40 topCapHeight:0] forState:UIControlStateNormal];
    • Se utiliza sólo la @2x botón? Raro. Como he añadido arriba, yo ahora uso un no-retina y un @2x versión de mi botón y funciona. Aprecio su esfuerzo. Muchas gracias!
    • Si utiliza UIButton *button=[[UIButton alloc] initWithFrame:CGRectMake(10, 10, 91, 43)]; y la altura del archivo de la imagen es el doble del tamaño de la trama, que al parecer necesita una versión retina demasiado. Hmm…

Dejar respuesta

Please enter your comment!
Please enter your name here