我正试图给层叠在一起的视图添加一个阴影,视图折叠后可以看到其他视图中的内容,在这种情况下,我希望保持view.clipsToBounds,这样当视图折叠时,它们的内容就会被剪裁.

这似乎让我很难在图层上添加阴影,因为当我打开clipsToBounds的时候,阴影也被剪掉了.

我一直在try 操纵view.frameview.bounds,以便在画面上添加一个投影,但允许边界足够大,以包含它,但是我在这方面没有运气.

这是我用来添加阴影的代码(这只在clipsToBounds关闭时才有效,如图所示)

view.clipsToBounds = NO;
view.layer.shadowColor = [[UIColor blackColor] CGColor];
view.layer.shadowOffset = CGSizeMake(0,5);
view.layer.shadowOpacity = 0.5;

这是阴影应用到最亮的灰色顶层的屏幕截图.希望这能给出一个 idea ,如果clipsToBounds关闭,我的内容将如何重叠.

影子应用程序.

我怎样才能在我的UIView页上添加阴影,并保持内容的剪裁?

编辑:只是想补充一点,我也try 过使用阴影背景图像,这确实很好,但是我仍然想知道最好的编码解决方案.

推荐答案

试试这个:

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;

First of all:用作shadowPathUIBezierPath至关重要.如果你不使用它,一开始你可能没有注意到不同之处,但敏锐的眼睛会观察到在旋转设备和/或类似事件期间发生的某种滞后.这是一个重要的性能调整.

Regarding your issue specifically:重要的线路是view.layer.masksToBounds = NO.它会禁用延伸到视图边界之外的the view's layer's sublayers的剪裁.

对于那些想知道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
}

Swift 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
}

Ios相关问答推荐

StackView UIKit间距似乎非常小的编程式编程

SWIFT中具有可选返回类型和泛型的网络请求

SwiftUI图表-默认情况下,X轴数据点的间距不相等

SWIFT AVFoundation翻转相机功能不起作用

如何在用户点击的位置使用SceneKit渲染球体?

一个 SwiftUI 视图中的多个垂直滚动视图

如何将单个按钮传递到自定义 ConfirmationDialog

使用 CIImage 支持的 UIImage 设置 UIImageView 时发生罕见的崩溃

通过 tuist/XcodeProj 以编程方式将文件添加到本机目标

何时需要将应用程序源包含在测试目标中?

界面生成器中 UIView 的边框 colored颜色 不起作用?

如何在 Swift 中使用包含多个值的查询参数构建一个 URL?

判断可选数组是否为空

故事板中的 colored颜色 与 UIColor 不匹配

如何使用 swift 添加速率按钮的链接?

Xcode 4.2 如何将一个项目包含到另一个项目中?

如何更改uitableview删除按钮文本

如何使用完成按钮制作 UIPickerView?

如果我的分发证书过期会怎样?

在 iOS 上没有显示数字键盘