试试这个:
UIBezierPath *shadowPath = [UIBezierPath bezierPathWithRect:view.bounds];
view.layer.masksToBounds = NO;
view.layer.shadowColor = [UIColor blackColor].CGColor;
view.layer.shadowOffset = CGSizeMake(0.0f, 5.0f);
view.layer.shadowOpacity = 0.5f;
view.layer.shadowPath = shadowPath.CGPath;
首先:在UIBezierPath
使用shadowPath
是至关重要的。如果您不使用它,一开始可能不会注意到有什么不同,但是敏锐的眼睛会观察到在旋转设备等事件期间发生一定的滞后。这是一项重要的性能调整。
关于您的问题:重要的是view.layer.masksToBounds = NO
。它禁用对视图图层的子图层的裁剪,该子图层的扩展范围超过视图的边界。
对于那些想知道masksToBounds
(在图层上)和视图自己的clipToBounds
属性之间有什么区别的人:确实没有任何区别。切换一个会影响另一个。只是不同级别的抽象。
Swift 2.2:
override func layoutSubviews()
{
super.layoutSubviews()
let shadowPath = UIBezierPath(rect: bounds)
layer.masksToBounds = false
layer.shadowColor = UIColor.blackColor().CGColor
layer.shadowOffset = CGSizeMake(0.0, 5.0)
layer.shadowOpacity = 0.5
layer.shadowPath = shadowPath.CGPath
}
斯威夫特3:
override func layoutSubviews()
{
super.layoutSubviews()
let shadowPath = UIBezierPath(rect: bounds)
layer.masksToBounds = false
layer.shadowColor = UIColor.black.cgColor
layer.shadowOffset = CGSize(width: 0.0, height: 5.0)
layer.shadowOpacity = 0.5
layer.shadowPath = shadowPath.cgPath
}
masksToBounds = NO;
到原始文件中-两次尝试都保持clipsToBounds = YES;
打开状态-都无法剪辑内容。这是您的示例发生的事情的屏幕截图> youtu.be/tdpemc_Xdps