2012-04-18 28 views
8

Tôi đã thử mọi phương pháp tôi tìm thấy nhưng tôi không thể làm được. Tôi chỉ muốn tạo một nhãn với các góc tròn, một bóng đổ với hình nền. Bóng chỉ hoạt động nếu tôi không muốn các góc tròn. Tôi không thể có được cả hai cùng nhau!Một nhãn UILabel với các góc tròn, bóng đổ và mẫu nền

Đây là mã của tôi với cái bóng:

label.text = msg; 
label.textAlignment = UITextAlignmentCenter; 
label.frame = CGRectMake(20,10,280,40); 
label.backgroundColor 
    = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"msg_box_bg.png"]]; 

[label.layer setCornerRadius:10]; 
[label.layer setMasksToBounds:NO]; 

/* Shadow */ 
label.layer.shadowColor = [UIColor blackColor].CGColor; 
label.layer.shadowOpacity = 0.6; 
label.layer.shadowOffset = CGSizeMake(0,0); 
label.layer.shadowRadius = 3; 

này mang lại cho tôi cái bóng không có các góc bo tròn. Nhưng nếu tôi sử dụng

[label.layer setMasksToBounds:YES]; 

Điều này sẽ cho tôi góc tròn không có bóng. Tôi đã thực hiện tư vấn để sử dụng đường dẫn bóng, vì vậy mã có đường dẫn bóng trông giống như sau:

label.text = msg; 
label.textAlignment = UITextAlignmentCenter; 
label.frame = CGRectMake(20,10,280,40); 
label.backgroundColor 
    = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"msg_box_bg.png"]]; 

[label.layer setCornerRadius:10]; 
[label.layer setMasksToBounds:YES]; 

/* Shadow */ 
label.layer.shadowColor = [UIColor blackColor].CGColor; 
label.layer.shadowOpacity = 0.6; 
label.layer.shadowOffset = CGSizeMake(0,0); 
label.layer.shadowRadius = 3; 
label.layer.shadowPath = [[UIBezierPath bezierPathWithRoundedRect:label.frame cornerRadius:10]CGPath]; 
label.layer.shouldRasterize = YES; 

Mã này cho tôi góc tròn nhưng không có bóng. Bất kỳ đề xuất nào?

Cảm ơn!

+0

http://stackoverflow.com/questions/3690972/why-maskstobounds-yes-prevents-calayer-shadow –

Trả lời

11

enter image description here

Tôi đã sử dụng mã bên dưới để nhận được kết quả sau.

CGSize size = CGSizeMake(280, 40); 

/** Shadow */ 
CALayer *shadowLayer = [CALayer new]; 
shadowLayer.frame = CGRectMake(20,100,size.width,size.height); 
shadowLayer.cornerRadius = 10; 

shadowLayer.backgroundColor = [UIColor clearColor].CGColor; 
shadowLayer.shadowColor = [UIColor blackColor].CGColor; 
shadowLayer.shadowOpacity = 0.6; 
shadowLayer.shadowOffset = CGSizeMake(0,0); 
shadowLayer.shadowRadius = 3; 

/** Label */ 
UILabel *label = [UILabel new]; 
label.text = @"Hello World"; 
label.textAlignment = UITextAlignmentCenter; 
label.frame = CGRectMake(0, 0, size.width, size.height); 
label.backgroundColor = [UIColor clearColor]; 
label.layer.cornerRadius = 10; 
[label.layer setMasksToBounds:YES]; 
// customLabel.backgroundColor = [UIColor whiteColor]; 
label.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"options.png"]]; 

/** Add the Label to the shawdow layer */ 
[shadowLayer addSublayer:label.layer]; 

[self.view.layer addSublayer:shadowLayer];  

[shadowLayer release]; 
+0

Điều này là chính xác. Vấn đề là một lớp được lấp đầy với một hình ảnh mẫu sẽ không tôn trọng bán kính góc trừ khi bạn che dấu các giới hạn, và một bóng sẽ không được vẽ nếu bạn _do_ mặt nạ giới hạn. Vì vậy, một lớp riêng biệt là cần thiết cho bóng tối. – jrturton

+0

Tôi thấy pont. Nhưng, tiếc là mã không hiển thị bất cứ điều gì cho tôi. Tôi đã sao chép mã như với tệp nền có tên "options.png" mà tôi không có, nó cho thấy một hộp đen. Khi tôi đặt vào tên tập tin nền của tôi nó không hiển thị bất cứ điều gì như vậy bao giờ hết. Tôi thực sự bối rối bởi điều này! Tôi sẽ cố gắng chơi với nó để xem tôi có thể làm được gì. – hsnm

+0

Những gì @jrturton nói là chính xác, đây là những gì tôi đã làm với mã. Theo bạn không thấy gì cả. Hãy gỡ lỗi các kết quả - hãy thử điều này, bình luận label.backgroundColor = [[UIColor alloc] initWithPatternImage: [UIImage imageNamed: @ "options.png"]]; dòng. Bỏ ghi chú dòng trên và đổi tên biến customLabel thành nhãn. Bây giờ bạn sẽ thấy một nhãn tròn màu trắng với một bóng đen. Đang nhận được kết quả đó? – haroldcampbell

Các vấn đề liên quan