2011-01-24 19 views
7

Estoy usando el siguiente código para agregar una capa de degradado a un UIButton. Funciona bien, pero el título ya no es visible. ¿Alguien sabe cómo arreglarlo?UIButton: Agregar capa de degradado y el título ya no se muestra - ¿cómo solucionarlo?

UIButton oAddressBtn = UIButton.FromType (UIButtonType.Custom); 
oAddressBtn.Frame = new RectangleF (0, 0, 150, 25); 
oAddressBtn.VerticalAlignment = UIControlContentVerticalAlignment.Center; 
oAddressBtn.Font = UIFont.FromName("Helvetica", 12); 
oAddressBtn.SetTitleColor (UIColor.White, UIControlState.Normal); 

// Create a gradient for the background. 
CAGradientLayer oGradient = new CAGradientLayer(); 
oGradient.Frame = oAddressBtn.Bounds; 
oGradient.Colors = new CGColor[] { UIColor.FromRGB (170, 190, 235).CGColor, UIColor.FromRGB (120, 130, 215).CGColor }; 

// Assign gradient to the button. 
oAddressBtn.Layer.MasksToBounds = true; 
oAddressBtn.Layer.AddSublayer (oGradient); 
oAddressBtn.Layer.CornerRadius = 10; 
oAddressBtn.Layer.BorderColor = UIColor.FromRGB (120, 130, 215).CGColor; 

// Set the button's title. 
oAddressBtn.SetTitle (sAddress, UIControlState.Normal); 

Respuesta

13

¡Ja! Hacer una pregunta y luego descubrirlo por mi cuenta ... coincidencia. Tuve que cambiar el orden. Después de asignar el degradado, las propiedades del texto del botón deben establecerse y no antes. Código fijo aquí:

UIButton oAddressBtn = UIButton.FromType (UIButtonType.Custom); 
oAddressBtn.Frame = new RectangleF (0, 0, 150, 25); 

// Create a gradient for the background. 
CAGradientLayer oGradient = new CAGradientLayer(); 
oGradient.Frame = oAddressBtn.Bounds; 
oGradient.Colors = new CGColor[] { UIColor.FromRGB (170, 190, 235).CGColor, UIColor.FromRGB (120, 130, 215).CGColor }; 

// Assign gradient to the button. 
oAddressBtn.Layer.MasksToBounds = true; 
oAddressBtn.Layer.AddSublayer (oGradient); 
oAddressBtn.Layer.CornerRadius = 10; 
oAddressBtn.Layer.BorderColor = UIColor.FromRGB (120, 130, 215).CGColor; 

// Set the button's title. Alignment and font have to be set here to make it work. 
oAddressBtn.VerticalAlignment = UIControlContentVerticalAlignment.Center; 
oAddressBtn.Font = UIFont.FromName("Helvetica", 12); 
oAddressBtn.SetTitleColor (UIColor.White, UIControlState.Normal); 

oAddressBtn.SetTitle (sAddress, UIControlState.Normal); 
+1

he encontrado otra manera de resolver el problema. No utilice la API Layer.AddSublayer, en su lugar utilice Layer.insertSublayer atIndex API y establezca el índice en 0. (Mi aplicación está escrita en OC y no conozco la API de Swift ...) – StoneLam

2

No tengo idea de cómo se hace esto en monotouch. Pero la respuesta a continuación es la variante Obj-C para un enfoque en el que no tiene que agregar una subcapa.

En lugar de insertar una capa de degradado, también puede anular el método +layerClass para devolver la clase CAGradientLayer. La capa del botón es que de esa clase, y se puede configurar fácilmente sus colores, etc.

+ (Class)layerClass { 
    return [CAGradientLayer class]; 
} 
+1

Esta es también una buena solución ¿Quieres un fondo en forma. Simplemente reemplace 'CAGradientLayer' con' CAShapeLayer'. Evita fácilmente la molestia de perder el tiempo con las jerarquías de capas/vistas internas de UIButton, lo que a menudo provoca la desaparición del texto o las imágenes. – sobri

2

Una opción diferente es usar una herramienta llamada Pixate terceros. http://www.pixate.com/ Esta herramienta le permite usar CSS3 y configurar los estilos de control de iOS de esa manera. De esta forma puedes eliminar todos los matices de control de bajo nivel.

Utilizándolo ahora y realmente disfrutando de la familiaridad. Un diseño puede construir el archivo CSS para ti y ¡estarías listo!

+0

También estoy explorando Pixate. Me gusta cómo funciona y trato de encontrar un flujo de trabajo que se adapte a mí y a un diseñador. – Raymond

1

Para un botón, la adición de la subcapa no funcionó. Insertar la subcapa debajo de la etiqueta del título me funcionó. Aquí está el código de referencia:

- (void) addGradientOnButtonWithStartColor: (UIColor *) StartColor mediumColor: (UIColor *) mediumColor andEndColor: (UIColor *) EndColor forButton: (UIButton *) CustomButton andTitle: (NSString *) buttonTitle {

CAGradientLayer *gradientLayer = [CAGradientLayer layer]; 
gradientLayer.frame = customButton.layer.bounds; 
gradientLayer.colors = [NSArray arrayWithObjects: 
         (id)startColor.CGColor, 
         (id)mediumColor.CGColor, 
         (id)endColor.CGColor, 
         nil]; 

gradientLayer.locations = nil; 
gradientLayer.masksToBounds = YES; 
gradientLayer.cornerRadius = customButton.layer.cornerRadius; 
[customButton.layer insertSublayer:gradientLayer below:customButton.titleLabel.layer]; 


[customButton setTitle:buttonTitle forState:UIControlStateNormal]; 
[customButton setTitle:buttonTitle forState:UIControlStateSelected]; 

}

llama a este método en el interior método viewDidAppear.

Gracias, Ratneshwar

Cuestiones relacionadas