2012-02-09 24 views
11

Tôi muốn tạo ra một inner shadow trên UIView tôi trên iPad như thế:Tạo inner shadow trong UIView

UIView with shadow

UIView Điều này có thể thay đổi kích thước vì vậy tôi không thể sử dụng một hình ảnh đơn giản để tạo ra loại này của bóng tối.

Tôi đã thử nghiệm với setShadow v.v., nhưng nó chỉ là một dropshadow được tạo ra.

Bất kỳ ý tưởng nào về cách tạo loại bóng này?

Trả lời

6

Tạo bóng như là một lớp trong suốt tại một kích thước cụ thể, sau đó tạo ra một hình ảnh căng ra, như thế này:

UIImage *shadowImage = [UIImage imageNamed:@"shadow.png"]; 
shadowImage = [shadowImage stretchableImageWithLeftCapWidth:floorf(shadowImage.size.width/2) topCapHeight:floorf(shadowImage.size.height/2)]; 

Sau đó bạn có thể đặt mà như hình ảnh ở một UIImageView với quy mô contentMode để phù hợp và nó sẽ làm việc theo cách bạn muốn.

Cho phép nói chế độ xem của bạn được gọi là "myView". Bạn có thể thêm vào bóng tối như thế này:

UIImageView *shadowImageView = [[UIImageView alloc] initWithImage:shadowImage]; 
shadowImageView.contentMode = UIViewContentModeScaleToFill; 
shadowImageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
shadowImageView.frame = myView.bounds; 
[myView addSubview:shadowImageView]; 
[shadowImageView release]; // only needed if you aren't using ARC 

Bạn cũng có thể làm hầu hết những điều này trong xây dựng giao diện nếu bạn thích, miễn là bạn tạo ra hình ảnh căng ra chính nó trong mã.

+0

tôi sẽ kiểm tra rằng bây giờ. – alexmngn

+0

Tôi có thể làm gì để thêm hình ảnh căng này trên nền của UIView của tôi? Với phương thức 'backgroundColor', nó không hoạt động. – alexmngn

+0

Bạn có thấy phần thứ hai của câu trả lời của tôi về việc sử dụng UIImageView và thêm nó dưới dạng chế độ xem phụ vào chế độ xem chính của bạn không? –

1

Câu hỏi này đã được phần trả lời trong SO

view.layer.masksToBounds = NO; 
view.layer.cornerRadius = 8; // if you like rounded corners 
view.layer.shadowRadius = 5; 
view.layer.shadowOpacity = 0.5; 
CGFloat indent = 10; 
CGRect innerRect = CGRectMake(indent,indent,view.frame.size.width-2*indent,view.frame.size.height-2*indent); 
view.layer.shadowPath = [UIBezierPath bezierPathWithRect:innerRect].CGPath; 

Chơi xung quanh với các biến cho đến khi họ phù hợp với phong cách bóng của bạn.

CẬP NHẬT

Thay vào đó bạn có thể rút ra một cái bóng bên ngoài trên một cái nhìn trung tâm nhỏ hơn nằm trên đầu trang của cái nhìn hiện tại của bạn.

CGFloat indent = 10; 
CGRect innerRect = CGRectMake(indent,indent,view.frame.size.width-2*indent,view.frame.size.height-2*indent); 
UIView * shadowView = [[UIView alloc] initWithFrame:innerRect]; 
shadowView.backgroundColor = [UIColor clearColor]; 
shadowView.layer.masksToBounds = NO; 
shadowView.layer.cornerRadius = 8; // if you like rounded corners 
shadowView.layer.shadowRadius = 5; 
shadowView.layer.shadowOpacity = 0.5; 
shadowView.layer.shadowPath = [UIBezierPath bezierPathWithRect:shadowView.bounds].CGPath; 
[view addSubview:shadowView]; 
[shadowView release]; 
+0

Đó là một cách tuyệt vời để vẽ một bóng * * bên ngoài - nhưng tôi không chắc chắn cách dễ dàng để thích ứng với điều đó để vẽ một bóng * bên trong *. –

+0

Bằng cách đặt chế độ xem nhỏ hơn rõ ràng trên đầu chế độ xem hiện tại của bạn và vẽ một bóng bên ngoài trên màn hình con nhỏ hơn rõ ràng. Miễn là chế độ xem nhỏ hơn được căn giữa, bạn sẽ không sao. –

+3

Điều đó sẽ không hiệu quả, bóng sẽ mờ dần về phía cạnh thay vì bị tối hơn. Ngoài ra, tôi không nghĩ rằng các khung nhìn trong suốt có thể đổ bóng. –

9

Bạn có thể tìm thấy nó hữu ích, tôi đã thực hiện một UIView loại cho rằng

https://github.com/Seitk/UIView-Shadow-Maker

+0

Cảm ơn, đó là một lớp học tuyệt vời! –

+0

Cảm ơn bạn rất nhiều bạn thân – webaba

+0

@Seitk bạn là một ngôi sao! cảm ơn – Petar