2010-01-11 32 views
64

Tôi có UIImageView mà tôi muốn thêm bóng sau. Tôi ước rằng táo đã có tài sản đó nhưng họ phải làm rất nhiều thứ khó khăn cho chúng tôi vì vậy tôi cần đặt câu hỏi này.Cách tốt nhất để tạo bóng tối đằng sau UIImageView

+1

Có thể, bạn muốn sử dụng chức năng vẽ Bản đồ lõi để vẽ bóng. –

+0

Những câu hỏi này rất giống với câu hỏi của bạn: http://stackoverflow.com/questions/962827/uiimage-shadow, http://stackoverflow.com/questions/1943087/i-am-trying-to-add-a-drop -shadow-to-a-uimageview –

Trả lời

195

Có một cách tốt hơn và dễ dàng hơn để làm điều này. UIImageView kế thừa từ UIView để nó có thuộc tính lớp. Bạn có thể truy cập các thuộc tính shadow của layer và bam, bạn có một shadow.

Nếu bạn có UIImageView dưới dạng IBOutlet thành tệp nib, bạn chỉ có thể triển khai awakeFromNib ví dụ:

Objective-C

- (void)awakeFromNib { 
    imageView.layer.shadowColor = [UIColor purpleColor].CGColor; 
    imageView.layer.shadowOffset = CGSizeMake(0, 1); 
    imageView.layer.shadowOpacity = 1; 
    imageView.layer.shadowRadius = 1.0; 
    imageView.clipsToBounds = NO; 
} 

Đừng quên #import "QuartzCore/CALayer.h"


Đối với Swift, bạn có thể đi về nó theo nhiều cách. Tạo một lớp mở rộng, phân lớp hoặc một cá thể imageView. Cho dù cách nào, quá trình này cũng giống nhau trong việc sửa đổi thuộc tính shadow của layer.

Swift 3

override func awakeFromNib() { 
    super.awakeFromNib() 

    imageView.layer.shadowColor = UIColor.purple.cgColor 
    imageView.layer.shadowOffset = CGSize(width: 0, height: 1) 
    imageView.layer.shadowOpacity = 1 
    imageView.layer.shadowRadius = 1.0 
    imageView.clipsToBounds = false 
} 
+27

Bạn cũng có thể cần 'imageView.clipsToBounds = NO;' hoặc bóng sẽ bị cắt bớt. – mxcl

+0

vâng, bạn nói đúng. đừng quên điều đó! –

+18

bạn cũng sẽ cần phải #import "QuartzCore/CALayer.h" – dev

10

Điều đơn giản nhất để làm là thêm một lớp bóng tối để xem hình ảnh của bạn:

CALayer    *layer = [CALayer layer]; 
CGRect    bounds = self.bounds; 

layer.bounds = bounds; 
layer.position = CGPointMake(bounds.size.width/2 + 3, bounds.size.height/2 + 3); 
layer.backgroundColor = [UIColor colorWithWhite: 0.25 alpha: 0.55].CGColor; 
layer.zPosition = -5; 

[self.layer addSublayer: layer]; 

Hãy chắc chắn "Clip subviews" bị tắt cho xem

+1

tại sao bạn tạo một giới hạn CGRect * khi bạn chỉ có thể đặt giới hạn của lớp thành self.bounds? Và cái bóng đi vào đâu? – Jaba

+0

Tôi tạo một biến tạm thời để dễ đọc; gõ self.bounds dài hơn một chút so với giới hạn, và làm cho mã ít dễ đọc hơn. Lớp này là cái bóng. Tất nhiên, điều này giả định rằng bạn đã có một hình vuông; nếu bạn đang làm hình ảnh không phải hình chữ nhật, bạn sẽ phải sử dụng mặt nạ hình ảnh tùy chỉnh. –

+0

Tôi cũng muốn nó bị mờ và tôi không biết làm thế nào tôi sẽ làm điều đó. Xin giúp đỡ! – Jaba

4

trong thêm vào đó, nếu bạn muốn làm cho đường viền màu trắng và bóng tối, bạn có thể sử dụng mã rằng:

//shadow part 
imageView.layer.shadowColor = [UIColor blackColor].CGColor; 
imageView.layer.shadowOffset = CGSizeMake(0, 1); 
imageView.layer.shadowOpacity = 1; 
imageView.layer.shadowRadius = 1.0; 
//white border part 
[imageView.layer setBorderColor: [[UIColor whiteColor] CGColor]]; 
[imageView.layer setBorderWidth: 2.0]; 
+0

Nhưng trong trường hợp này, bạn làm cách nào để tạo phần bóng của thuộc tính .image, giả sử, lưu hoặc hiển thị hình ảnh đó ở một nơi khác? – alejandrormz

+0

Bạn không thể. Bạn không chỉnh sửa hình ảnh, bạn đang sử dụng nó để hiển thị. Để thực sự chỉnh sửa dữ liệu bitmap là * nhiều * phức tạp hơn. Hãy xem xét chỉ đơn giản là adorning hình ảnh ở khắp mọi nơi bạn hiển thị nó như bạn thường không muốn xử lý hình ảnh để thêm các loại hiệu ứng, trừ khi bạn làm như vậy trong một kết thúc trở lại mà xử lý chúng theo lô. – Tim

-2

UIView thiết shadowlayer

và addSubview: imageView của bạn

+0

Bạn có thể giải thích về điều đó không? Cảm ơn! –

4

Giải pháp Swift với phần mở rộng. Subclassing là không cần thiết. Gọi myImage.addShadow() từ viewDidLoad(). Điều này sẽ hoạt động cho UIViewUIImageView.

extension UIView { 

    func addShadow() { 
     layer.shadowColor = UIColor.black.cgColor 
     layer.shadowOffset = CGSize(width: 0, height: 0) 
     layer.shadowOpacity = 0.5 
     layer.shadowRadius = 5 
     clipsToBounds = false 
    } 
} 
Các vấn đề liên quan