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];
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 đó. –
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
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. –