2011-01-24 11 views
7

Sto usando il codice qui sotto per aggiungere un gradiente a un UIButton. Funziona bene ma il titolo non è più visibile. Qualcuno sa come risolvere?UIButton: Aggiungi livello sfumatura e il titolo non viene più mostrato - come risolvere?

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); 

risposta

13

Ha! Fare una domanda e poi scoprirla da sola ... coincidenza. Ho dovuto cambiare l'ordine. Dopo aver assegnato il gradiente, le proprietà del testo del pulsante devono essere impostate e non prima. Risolto il codice qui:

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

ho trovato un altro modo per risolvere il problema. Non utilizzare l'API Layer.AddSublayer, utilizzare invece Layer.insertSublayer inIndex API e impostare l'indice su 0. (La mia app è scritta in OC e non conosco l'API Swift ...) – StoneLam

2

Non ho idea di come sia fatto in monotipo. Ma la risposta seguente è la variante Obj-C per un approccio in cui non è necessario aggiungere un sottolivello.

Invece di inserire un livello sfumatura, è anche possibile sovrascrivere il metodo +layerClass per restituire la classe CAGradientLayer. Lo strato del pulsante è che di quella classe, e si può facilmente impostare i colori ecc

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

Questa è anche una buona soluzione vuoi uno sfondo a forma di Basta sostituire 'CAGradientLayer' con' CAShapeLayer'. Evita accuratamente la seccatura di chiacchierare con le gerarchie di livello/vista interne di UIButton, che spesso scompaiono nel testo o nelle immagini. – sobri

2

Una diversa opzione è quella di utilizzare una terza parte chiamata strumento Pixate. http://www.pixate.com/ Questo strumento consente di utilizzare CSS3 e impostare gli stili di controllo iOS in questo modo. In questo modo puoi eliminare tutte le sfumature di controllo di basso livello.

Usarlo ora e godendo davvero la familiarità. Un design può costruire il file CSS per te e tu dovresti andare!

+0

Sto anche esplorando Pixate. Come funziona e sta cercando di creare un flusso di lavoro che sia adatto a me e a un designer. – Raymond

1

Per un pulsante l'aggiunta del sottolivello non ha funzionato per questo. L'inserimento del sottolivello sotto l'etichetta del titolo ha funzionato per me. Ecco il codice di riferimento:

- (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]; 

}

chiamare questo metodo all'interno metodo viewDidAppear.

Grazie, Ratneshwar

Problemi correlati