【发布时间】:2014-08-12 03:39:21
【问题描述】:
我希望在视图中添加多个具有不同不透明度的阴影。阴影的规格如下:
- Y 偏移量为 4,模糊半径为 1
- Y 偏移为 10,模糊半径为 10
- Y 偏移量为 2,模糊半径为 4
- 模糊半径为 1,散布为 1(无偏移,可能必须是 4 个不同的阴影)
我可以使用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)
(虽然这段代码是用 Swift 编写的,但我相信它对大多数 Cocoa/Objective-C 开发人员来说已经足够熟悉了。只要知道layer 在这种情况下等同于self.layer。)
但是,当我尝试为每个阴影使用不同的不透明度时,就会出现问题。 layer 的 shadowOpacity 属性最终会应用于其所有子层。这是一个问题,因为我需要它们都有自己的阴影不透明度。我尝试将每个图层的阴影不透明度设置为正确的值(0.04、0.12 等),但随后将 layer 的 0.04 的不透明度应用于所有子图层。所以我尝试将layer.shadowOpacity 设置为1.0,但这使得所有阴影都变成了纯黑色。我也试着聪明点,做了layer2.shadowColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.12).CGColor,但它只是变成了全黑,没有透明度。
我认为图层都应该具有相同的阴影不透明度是有某种意义的。但是有什么方法可以让这个工作,不同的不透明度和所有(如果它更容易另一种方式,则不必使用CALayer)?
请不要回答“只使用图片”:无论这多么理智,我都在努力避免它。快来逗我吧。
谢谢。
编辑:根据要求,这是我所追求的:。
【问题讨论】:
-
您能否发布您的视图的屏幕截图,以便我了解您想要做什么,我可能会帮助您
-
@artud2000 添加了我想要实现的目标的图像。
-
好的,让我看看我们能做什么
-
Mmmmm 我不熟悉 Swift 但是让 layer2 = CALayer(layer: layer) 那行意味着 layer2 等于 layer?如果是这样,你应该初始化全新的 CALayer 实例,如果不是,如果你改变层中的一个属性,它会影响其他层
-
@artud2000 不,这相当于 [[CALayer alloc] initWithLayer: layer],根据 Apple 的文档,它返回“具有从层复制的任何自定义实例变量的层实例”——属性好像被抄袭了。
标签: ios cocoa-touch uiview quartz-core dropshadow