2011-01-24 27 views
7

下のコードを使用して、グラデーションレイヤーをUIButtonに追加しています。うまく動作しますが、タイトルはもう表示されません。誰かが修正する方法を知っていますか?UIButton:グラデーションレイヤーを追加し、タイトルが表示されなくなりました。

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

答えて

13

ハ!質問をして、自分でそれをすべて見つけ出す...偶然。 注文を変更する必要がありました。グラデーションを割り当てた後、ボタンのテキストプロパティを設定する必要があります。固定コードここに:

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

は、私は問題を解決する別の方法を発見しました。 Layer.AddSublayer APIを使用せず、代わりにLayer.insertSublayer atIndex APIを使用してインデックスを0に設定してください(私のアプリはOCで書かれていて、Swift APIはわかりません...) – StoneLam

2

これはモノタッチでどのように行われているのかわかりません。しかし、以下の答えは、サブレイヤを追加する必要がないアプローチのObj-Cの変種です。

グラデーションレイヤーを挿入する代わりに、+layerClassメソッドをオーバーライドしてCAGradientLayerクラスを返すこともできます。ボタンの層、そのクラスの以上である、あなたは簡単にその色を設定することができますなど

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

これは良い解決策ですあなたは、形の背景をしたいですか?単に 'CAGradientLayer'を' CAShapeLayer'に置き換えてください。 UIButtonの内部のレイヤー/ビュー階層を使っていても、テキストや画像が消えてしまいます。 – sobri

2

は別のオプションは、サードパーティのツールを呼び出しPixateを使用することです。 http://www.pixate.com/ このツールを使用すると、CSS3を使用して、iOSコントロールスタイルをそのように設定できます。このようにして、すべての低レベルのコントロールのニュアンスを取り除くことができます。

これを使用して、今では親しみを楽しんでいます。デザインはあなたのためのCSSファイルを構築することができ、あなたは行くのがいいでしょう!

+0

私はPixateも探検しています。どのように動作し、私とデザイナーに合ったワークフローを作り出そうとしているかのように。 – Raymond

1

サブレイヤを追加するボタンが機能しませんでした。タイトルラベルの下にサブレイヤーを挿入すると、私のために働いた。 (UIColor *)startColor mediumColor:(UIColor *)mediumColor andEndColor:(UIColor *)endColor forButton:(UIButton *)customButton andTitle:(NSStringの*)buttonTitle {

- (ボイド)addGradientOnButtonWithStartColor

:ここで参照コードであります

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

}

viewDidAppear方法内側このメソッドを呼び出します。

おかげで、 Ratneshwar

関連する問題