2011-01-24 7 views
7

Używam poniższego kodu, aby dodać warstwę gradientu do UIButton. Działa dobrze, ale tytuł nie jest już widoczny. Czy ktoś wie, jak to naprawić?UIButton: Dodaj warstwę gradientu i tytuł nie jest już wyświetlany - jak to naprawić?

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

Odpowiedz

13

Ha! Zadaję pytanie, a potem sam się go poznaję ... zbieg okoliczności. Musiałem zmienić zamówienie. Po przypisaniu gradientu właściwości tekstu przycisku muszą być ustawione, a nie wcześniej. Naprawiono kod tutaj:

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

znalazłem inny sposób na rozwiązanie tego problemu. Nie używaj API Layer.AddSublayer, zamiast tego użyj Layer.insertSublayer atIndex API i ustaw indeks na 0. (Moja aplikacja jest napisana w języku OC i nie znam interfejsu API Swift ...) – StoneLam

2

Nie mam pojęcia, jak to zrobić w Monotouch. Ale odpowiedź poniżej jest wariantem Obj-C dla podejścia, w którym nie musisz dodawać podwarstwy.

Zamiast wstawiania warstwy gradientowej można również zastąpić metodę +layerClass, aby zwrócić klasę CAGradientLayer. Warstwa przycisku jest niż z tej klasy, i można łatwo ustawić swoje kolory itd

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

To także dobre rozwiązanie chcesz mieć ukształtowane tło. Po prostu zamień 'CAGradientLayer' na' CAShapeLayer'. Łagodnie unika problemów związanych z wewnętrznymi warstwami/widokami UIButtonów, co często powoduje znikanie tekstu lub obrazów. – sobri

2

Innym rozwiązaniem jest użycie osobę trzecią rozmowę narzędzie Pixate. http://www.pixate.com/ To narzędzie umożliwia używanie CSS3 i ustawianie stylów sterowania iOS w ten sposób. W ten sposób wyeliminujesz wszystkie niuanse kontrolne niskiego poziomu.

Używając go teraz i naprawdę ciesząc się znajomością. Projekt może zbudować dla Ciebie plik CSS i dobrze byś poszła!

+0

Eksploruję także Pixate. Podobnie jak to działa i stara się wymyślić przepływ pracy, który pasuje do mnie i projektanta. – Raymond

1

Nie można dla niego dodać przycisku dodawania podwarstw. Wstawianie podwarstwa pod etykietą tytułu pracowało dla mnie. Oto kod referencyjny:

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

}

wywołanie tej metody wewnątrz metody viewDidAppear.

Dzięki Ratneshwar

Powiązane problemy