Aeh*_*mlo 11 cocoa-touch uiview dropshadow ios quartz-core
我想在视图中添加多个具有不同不透明度的阴影.阴影的规格如下:
我可以用CALayers 来完成所有这些工作.这是我为此工作的代码(请注意我还没有打扰设置shadowPath,直到我得到多个阴影的东西才会工作):
layer.cornerRadius = 4
layer.masksToBounds = false
layer.shouldRasterize = true
let layer2 = CALayer(layer: layer), layer3 = CALayer(layer: layer), layer4 = CALayer(layer: layer)
layer.shadowOffset = CGSizeMake(0, 4)
layer.shadowRadius = 1
layer2.shadowOffset = CGSizeMake(0, 10)
layer2.shadowRadius = 10
layer2.shadowColor = UIColor.blackColor().CGColor
layer2.shouldRasterize = true //Evidently not copied during initialization from self.layer
layer3.shadowOffset = CGSizeMake(0, 2)
layer3.shadowRadius = 4
layer3.shouldRasterize = true
layer4.shadowOffset = CGSizeMake(0, 1)
layer4.shadowRadius = 1
layer4.shadowOpacity = 0.1
layer4.shouldRasterize = true
layer.addSublayer(layer2)
layer.addSublayer(layer3)
layer.addSublayer(layer4)
Run Code Online (Sandbox Code Playgroud)
(虽然这段代码在Swift中,但我相信它对于大多数Cocoa/Objective-C开发人员而言看起来很熟悉,因为它才有意义.只知道在这种情况下它就layer等同了self.layer.)
然而,当我尝试对每个阴影使用不同的不透明度时,会出现问题.该shadowOpacity属性layer最终应用于其所有子层.这是一个问题,因为我需要他们所有人拥有自己的阴影不透明度.我已经尝试每一层的影子的不透明度设置为它的正确值(0.04,0.12等),但随后的不透明度0.04的layer适用于所有子层.于是,我就设置layer.shadowOpacity到1.0,但这种把所有的阴影纯黑色.我也试着做layer2.shadowColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.12).CGColor得很聪明,但它只是变成了全黑而没有透明度.
我认为它的某种意义是层应该都具有相同的阴影不透明度.但是有什么方法可以让这种工作,不同的不透明度和所有(CALayer如果更容易以另一种方式使用,则不必使用)?
请不要回答"只是使用图像":无论多么理智,我都试图避免它.只是幽默我
谢谢.
编辑:根据要求,这是我追求的:
.
需要添加的关键是设置图层' shadowPath。默认情况下,Core Graphics 会在图层的可见内容周围绘制阴影,但在您的代码中,既没有backgroundColor也没有bounds为图层设置阴影,因此图层实际上是空的。
假设您有一个 UIView 子类,您可以通过添加如下内容来使其工作:
override func layoutSubviews() {
super.layoutSubviews()
layer.sublayers?.forEach { (sublayer) in
sublayer.shadowPath = UIBezierPath(rect: bounds).cgPath
}
}
Run Code Online (Sandbox Code Playgroud)
我在具有多个阴影的视图上测试了这种方法,一旦shadowPath为阴影层定义了 ,它就会按预期工作。不同的阴影颜色和不透明度也有效,但您必须记住,层次结构中的上层将与它们后面的层重叠,因此如果前面的层有较厚的阴影,则其他阴影可能会被它隐藏。