2014-05-01 10 views
6

Làm cách nào để che mặt nạ CALayer với bóng, sao cho bóng chỉ nằm ngoài đường dẫn? Tôi không muốn cái bóng đằng sau một cái nhìn trong suốt.Che bóng bóng vào bên ngoài của rect chỉ

shadowLayer.shadowOffset = CGSizeMake(x, y); 
shadowLayer.shadowRadius = radius; 
shadowLayer.shadowOpacity = opacity; 
shadowLayer.shadowColor = color.CGColor; 
shadowLayer.shadowPath = [UIBezierPath bezierPathWithRect:view.bounds].CGPath; 

Cảm ơn bạn.

+1

Bạn có thể phải tạo lớp trong suốt chỉ dành cho bóng tối và che mặt lớp đó, sau đó hiển thị lớp của bạn mà không có bóng trên đầu trang đó. –

+0

Vâng, phần mặt nạ là nơi tôi gặp rắc rối, chỉ che mặt bên trong. – ssteinberg

+1

Tôi không chắc chắn về chi tiết, nhưng bạn có thể cần tạo một lớp hình dạng lớn hơn các cạnh của bóng tối, sau đó thêm đường dẫn có kích thước của vùng bạn muốn che mặt và sử dụng lớp hình dạng đó làm mặt nạ của lớp với một cái bóng. Bạn có thể phải chơi với chế độ điền để có được giao lộ của các đường dẫn hoạt động chính xác. –

Trả lời

7

Tôi sẽ trả lời câu hỏi của riêng mình. Thêm một lớp bóng mới cho view. Điều này sẽ hoạt động với bất kỳ shadowPath, nếu được đặt chính xác.

float radius = 8; 
float opacity = 0.5f; 
float x = 4; 
float y = 6; 
UIColor *color = [UIColor blackColor]; 

// Shadow layer 
CALayer *shadowLayer = [CALayer layer]; 
shadowLayer.shadowOffset = CGSizeMake(x, y); 
shadowLayer.shadowRadius = radius; 
shadowLayer.shadowOpacity = opacity; 
shadowLayer.shadowColor = color.CGColor; 
shadowLayer.shadowPath = [UIBezierPath bezierPathWithRect:view.frame].CGPath; // Or any other path 

// Shadow mask frame 
CGRect frame = CGRectInset(view.layer.frame, -2*radius, -2*radius); 
frame = CGRectOffset(frame, x, y); 

// Translate shadowLayer shadow path to mask layer's coordinate system 
CGAffineTransform trans = CGAffineTransformMakeTranslation(-view.frame.origin.x-x+2*radius, 
                  -view.frame.origin.y-y+2*radius); 

// Mask path 
CGMutablePathRef path = CGPathCreateMutable(); 
CGPathAddRect(path, nil, (CGRect){.origin={0,0}, .size=frame.size}); 
CGPathAddPath(path, &trans, shadowLayer.shadowPath); 
CGPathCloseSubpath(path); 

// Mask layer 
CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init]; 
maskLayer.frame = frame; 
maskLayer.fillRule = kCAFillRuleEvenOdd; 
maskLayer.path = path; 

shadowLayer.mask = maskLayer; 

[view.layer.superlayer insertSublayer:shadowLayer below:view.layer]; 
+0

Khá một số mã để đạt được một điều đơn giản như vậy nhưng hoạt động hoàn hảo! Cảm ơn – edwardmp

1

Chỉ cần một bước tiến: u có thể sử dụng để thiết lập CAShapeLayer shadow

let shapeLayer = CAShapeLayer() 
shapeLayer.lineWidth = 2 
shapeLayer.fillColor = UIColor.clear.cgColor 
shapeLayer.strokeColor = UIColor.purple.cgColor 
shapeLayer.shadowColor = UIColor.black.cgColor 
shapeLayer.shadowOffset = CGSize(width: 0, height: 3) 
shapeLayer.shadowOpacity = 1 
view.layer.addSublayer(shapeLayer) 
0

ssteinberg's câu trả lời giúp tôi trong iOS 10,2 và Swift 3. Tôi đã có thể sử dụng câu trả lời của mình với một UIVisualEffectView để tạo ra một đẹp làm mờ mà còn với một cái bóng. Chuyển đổi sang Swift 3 tại đây:

let shadowLayer = CALayer() 

let mutablePath = CGMutablePath() 
let maskLayer = CAShapeLayer() 

let xOffset = CGFloat(4) 
let yOffset = CGFloat(6) 
let shadowOffset = CGSize(width: xOffset, height: yOffset) 
let shadowOpacity = Float(0.5) 
let shadowRadius = CGFloat(8) 
let shadowPath = UIBezierPath(rect: frame).cgPath 
let shadowColor = UIColor.black 
let shadowFrame = frame.insetBy(dx: -2 * shadowRadius, dy: -2 * shadowRadius).offsetBy(dx: xOffset, dy: yOffset) 
let shadowRect = CGRect(origin: .zero, size: shadowFrame.size) 
let shadowTransform = CGAffineTransform(translationX: -frame.origin.x - xOffset + 2 * shadowRadius, y: -frame.origin.y - yOffset + 2 * shadowRadius) 

shadowLayer.shadowOffset = shadowOffset 
shadowLayer.shadowOpacity = shadowOpacity 
shadowLayer.shadowRadius = shadowRadius 
shadowLayer.shadowPath = shadowPath 
shadowLayer.shadowColor = shadowColor.cgColor 

mutablePath.addRect(shadowRect) 
mutablePath.addPath(shadowLayer.shadowPath!, transform: shadowTransform) 
mutablePath.closeSubpath() 

maskLayer.frame = shadowFrame 
maskLayer.fillRule = kCAFillRuleEvenOdd 
maskLayer.path = mutablePath 

shadowLayer.mask = maskLayer 

layer.superlayer?.insertSublayer(shadowLayer, above: layer) 
Các vấn đề liên quan