2010-01-03 7 views
8

Estoy intentando crear un botón personalizado usando una imagen de fondo en el Interface Builder. La imagen tiene partes estirables y no estirables para que se pueda cambiar el tamaño.Fondo del botón personalizado de Interface Builder (iPhone dev) La imagen no respeta la configuración de Estiramiento

IB expone las propiedades de Estiramiento para permitir esto, sin embargo, ningún valor que agregue afectará la forma en que aparece el botón. Siempre está completamente extendido para llenar el tamaño del marco.

¿Es esta una característica no admitida en IB o en UIButton quizás?

http://img.skitch.com/20100103-rjabkq2c2jkqynw47crxepdtwb.jpg

(Nota: Los valores de estiramiento antes mencionados no son los que van a trabajar con la imagen correctamente, pero sólo los valores que me estaba metiendo con en el momento de la captura de pantalla)

+0

El mismo problema con los mismos archivos de ejemplo de UICatalog. ¿Cualquier progreso? ¿Tuviste que configurarlo en código? – JOM

Respuesta

2

En el ejemplo Comenzando en iPhone 3 Desarrollo sólo se usan los UIImage leftCapWidth y topCapHeight, y se crea la imagen/establecer mediante programación, por lo que es un método alternativo si contentStretch no está funcionando.

+0

Parece que esto simplemente no funciona como podría parecer. Los documentos hablan de estos valores haciendo exactamente lo que quiero (todo lo que estira la imagen del botón). Tener que hacer que el botón se vea correcto es algo extraño dado que tenemos toda una GUI haciendo GUI ... también conocido como IB. –

+0

En cuanto a la documentación para contentStretch, los valores predeterminados que muestran IB (en particular del 0,50) no son los valores por defecto reales de H/W 0,0 y 1,1 tamaño, así que supongo que no es demasiado sorprendente que los ajustes en Don IB no funciona Parece que contentStretch se agregó en 3.0, por lo que probablemente tenga algo que ver con eso. http://bugreport.apple.com/ – Nimrod

+1

No sigo. No estoy usando los valores predeterminados. Como dije, los valores que pongo no tienen ningún impacto. Los que se muestran en la captura de pantalla no son los predeterminados. Estaba ejecutando menos de 3.0. –

0

En los casos en que desea que se estire más de un píxel (es decir, un patrón en el centro del botón), el UIImage estirable no funciona.

El contenido de UIButton tampoco funciona correctamente.

Cómo lo resolví: subclase UIButton y agregué un UIImageView *backgroundImageView como propiedad y lo coloqué en el índice 0 como una subvista dentro del UIButton. Luego aseguro en layoutSubviews que encaja completamente en el botón y establece los estados resaltados de imageView. Todo lo que necesita hacer es entregar un UIImageView con el contentStretch y contentMode correctos aplicados.

archivo .h

@interface ButtonWithBackgroundImage : UIButton { 
    UIImageView *backgroundImageView; 
} 
@property (retain) UIImageView *backgroundImageView; 
+ (ButtonWithBackgroundImage*)button; 
@end 

archivo .m

@implementation ButtonWithBackgroundImage 
@synthesize backgroundImageView; 

+ (ButtonWithBackgroundImage*)button { 
return [self buttonWithType:UIButtonTypeCustom]; 
} 
- (void)setBackgroundImageView:(UIImageView*)img { 
    [backgroundImageView removeFromSuperview]; 
    [backgroundImageView release]; 

    backgroundImageView = [img retain]; 

    if(backgroundImageView){ 
     [self insertSubview:backgroundImageView atIndex:0]; 
     [self setNeedsLayout]; 
    } 
} 

- (void)setSelected:(BOOL)select { 
    [super setSelected:select]; 
    // we subclass the setSelect method to highlight the background imageview 
[backgroundImageView setHighlighted:select||self.highlighted]; 
} 
- (void)setHighlighted:(BOOL)highl { 
    [super setHighlighted:highl]; 

    // we subclass the setHighlighted method to highlight the background imageview  
    [backgroundImageView setHighlighted:highl||self.selected]; 
} 

- (void)layoutSubviews { 
    [super layoutSubviews]; 

    self.backgroundImageView.frame = self.bounds; 
} 

- (void)dealloc { 
    [backgroundImageView release]; 
    backgroundImageView = nil; 
    [super dealloc]; 
} 
@end 
+0

que soporta imágenes en mosaico ahora .. – hfossli

-1

lo tengo trabajando !!! Los valores mágicos para mí son 0.2 y 0.2.

Mi imagen es una caja dentro de una caja, ambas con esquinas redondeadas.

Cuando es 0,2 y 0,8, deja la parte superior de la imagen sin estirar, pero la parte inferior se estira y distorsiona.

Supongo que el primer 0.2 es el desplazamiento que significa cuánto no estirar, y el segundo es probablemente cuánto estirar. Al menos, 0.2 y 0.6 también funcionan.

En principio, puede hacer un experimento: tomar una imagen de un enrejado o círculos concéntricos o un degradado de color y estirarlo. Si lo hace, publique la imagen :).

0

La imagen de fondo del botón siempre se redimensionará para llenar el cuadro; la imagen de primer plano no cambiará de tamaño (si no hay texto, está centrada). La lógica del estiramiento es que cambia el tamaño del medio dejando intactos los bordes; por ejemplo, para un rectángulo redondeado, esto significa que las esquinas redondeadas no se distorsionarán.

0

Utilice la función de Xcode rebanar para especificar las dimensiones de un área central de tamaño variable de la imagen y especificar opcionalmente tapas de los extremos, que son áreas de la imagen que no debe ser llenado por el área de tamaño variable. Ver About Asset Catalogs

Cuestiones relacionadas