2011-01-24 7 views
7

Tôi đang sử dụng mã bên dưới để thêm lớp gradient vào UIButton. Hoạt động tốt nhưng tiêu đề không hiển thị nữa. Có ai biết cách sửa chữa không?UIButton: Thêm lớp Gradient và tiêu đề không được hiển thị nữa - cách khắc phục?

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

Trả lời

13

Ha! Đặt câu hỏi và sau đó tự mình tìm ra ... trùng hợp ngẫu nhiên. Tôi phải thay đổi thứ tự. Sau khi gán gradient, các thuộc tính văn bản của nút phải được thiết lập và không phải trước đó. Mã cố định tại đây:

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

Tôi đã tìm ra cách khác để giải quyết vấn đề. Không sử dụng Layer.AddSublayer API, thay vì sử dụng Layer.insertSublayer atIndex API và thiết lập chỉ mục thành 0. (Ứng dụng của tôi được viết bằng OC và tôi không biết Swift API ...) – StoneLam

2

Tôi không biết làm thế nào để thực hiện điều này bằng monotouch. Nhưng câu trả lời dưới đây là phiên bản Obj-C cho một cách tiếp cận mà bạn không phải thêm lớp con.

Thay vì chèn lớp gradient, bạn cũng có thể ghi đè phương thức +layerClass để trả về lớp CAGradientLayer. Các lớp của nút là hơn của lớp đó, và bạn có thể dễ dàng thiết lập màu sắc của nó vv

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

Đây cũng là một giải pháp tốt là bạn muốn có một hình nền. Chỉ cần thay 'CAGradientLayer' bằng' CAShapeLayer'. Độc đáo tránh những rắc rối của mucking về với các lớp bên trong của UIButton/view hierarchies, mà thường dẫn đến văn bản hoặc hình ảnh biến mất. – sobri

2

Một tùy chọn khác là sử dụng cuộc gọi công cụ bên thứ ba Pixate. http://www.pixate.com/ Công cụ này cho phép bạn sử dụng CSS3 và đặt kiểu điều khiển iOS theo cách đó. Bằng cách này, bạn có thể loại bỏ tất cả các sắc thái kiểm soát ở mức độ thấp.

Sử dụng ngay bây giờ và thực sự thích thú với sự quen thuộc. Một thiết kế có thể xây dựng ra các tập tin CSS cho bạn và bạn sẽ được tốt để đi!

+0

Tôi cũng đang khám phá Pixate. Giống như cách nó hoạt động và cố gắng tìm ra một quy trình làm việc phù hợp với tôi và một nhà thiết kế. – Raymond

1

Để nút thêm lớp con không hoạt động. Chèn sublayer bên dưới nhãn tiêu đề làm việc cho tôi. Đây là mã tham khảo:

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

}

Gọi phương pháp này bên trong phương pháp viewDidAppear.

Xin cảm ơn, Ratneshwar