我在草图中设计了UI元素,其中一个具有模糊1和传播0的阴影.我查看了视图图层属性的文档,图层没有任何名为spread或blur的东西,或者任何等效的东西(唯一的控件是only shadowOpacity)如何控制模糊和传播之类的东西?
编辑:
以下是Sketch中的设置:
这就是我希望我的阴影看起来像:
这就是目前的样子:
注意,你必须点击图片才能真正看到阴影.
我的代码如下:
func setupLayer(){ view.layer.cornerRadius = 2 view.layer.shadowColor = Colors.Shadow.CGColor view.layer.shadowOffset = CGSize(width: 0, height: 1) view.layer.shadowOpacity = 0.9 view.layer.shadowRadius = 5 }
Senseful.. 220
以下是如何将所有6个Sketch阴影属性应用于UIView的图层,具有接近完美的精度:
extension CALayer { func applySketchShadow( color: UIColor = .black, alpha: Float = 0.5, x: CGFloat = 0, y: CGFloat = 2, blur: CGFloat = 4, spread: CGFloat = 0) { shadowColor = color.cgColor shadowOpacity = alpha shadowOffset = CGSize(width: x, height: y) shadowRadius = blur / 2.0 if spread == 0 { shadowPath = nil } else { let dx = -spread let rect = bounds.insetBy(dx: dx, dy: dx) shadowPath = UIBezierPath(rect: rect).cgPath } } }
假设我们想要代表以下内容:
您可以通过以下方式轻松完成
myView.layer.applySketchShadow( color: .black, alpha: 0.5, x: 0, y: 0, blur: 4, spread: 0)
或者更简洁:
myView.layer.applySketchShadow(y: 0)
例:
左:iPhone 8 UIView截图; 右:草图矩形.
注意:
使用非零值时spread
,它会根据bounds
CALayer 的路径对路径进行硬编码.如果图层的边界发生变化,您需要applySketchShadow()
再次调用该方法.
相对于硬编码`blur / 2.0`,这应该是`shadowRadius = blur / UIScreen.main.scale`吗?或者,还有其他原因除以2吗?@matchifang你明白了吗? (3认同)
您忘记设置`maskToBounds = false`。 (2认同)
O-mkar.. 56
你可以尝试这个......你可以玩这些值.这shadowRadius
决定了模糊的数量.shadowOffset
决定阴影的去向.
Swift 2.0
let radius: CGFloat = demoView.frame.width / 2.0 //change it to .height if you need spread for height let shadowPath = UIBezierPath(rect: CGRect(x: 0, y: 0, width: 2.1 * radius, height: demoView.frame.height)) //Change 2.1 to amount of spread you need and for height replace the code for height demoView.layer.cornerRadius = 2 demoView.layer.shadowColor = UIColor.blackColor().CGColor demoView.layer.shadowOffset = CGSize(width: 0.5, height: 0.4) //Here you control x and y demoView.layer.shadowOpacity = 0.5 demoView.layer.shadowRadius = 5.0 //Here your control your blur demoView.layer.masksToBounds = false demoView.layer.shadowPath = shadowPath.CGPath
Swift 3.0
let radius: CGFloat = demoView.frame.width / 2.0 //change it to .height if you need spread for height let shadowPath = UIBezierPath(rect: CGRect(x: 0, y: 0, width: 2.1 * radius, height: demoView.frame.height)) //Change 2.1 to amount of spread you need and for height replace the code for height demoView.layer.cornerRadius = 2 demoView.layer.shadowColor = UIColor.black.cgColor demoView.layer.shadowOffset = CGSize(width: 0.5, height: 0.4) //Here you control x and y demoView.layer.shadowOpacity = 0.5 demoView.layer.shadowRadius = 5.0 //Here your control your blur demoView.layer.masksToBounds = false demoView.layer.shadowPath = shadowPath.cgPath
传播的例子
创建基本阴影
demoView.layer.cornerRadius = 2 demoView.layer.shadowColor = UIColor.blackColor().CGColor demoView.layer.shadowOffset = CGSizeMake(0.5, 4.0); //Here your control your spread demoView.layer.shadowOpacity = 0.5 demoView.layer.shadowRadius = 5.0 //Here your control your blur
Swift 2.0中的基本阴影示例
以下是如何将所有6个Sketch阴影属性应用于UIView的图层,具有接近完美的精度:
extension CALayer { func applySketchShadow( color: UIColor = .black, alpha: Float = 0.5, x: CGFloat = 0, y: CGFloat = 2, blur: CGFloat = 4, spread: CGFloat = 0) { shadowColor = color.cgColor shadowOpacity = alpha shadowOffset = CGSize(width: x, height: y) shadowRadius = blur / 2.0 if spread == 0 { shadowPath = nil } else { let dx = -spread let rect = bounds.insetBy(dx: dx, dy: dx) shadowPath = UIBezierPath(rect: rect).cgPath } } }
假设我们想要代表以下内容:
您可以通过以下方式轻松完成
myView.layer.applySketchShadow( color: .black, alpha: 0.5, x: 0, y: 0, blur: 4, spread: 0)
或者更简洁:
myView.layer.applySketchShadow(y: 0)
例:
左:iPhone 8 UIView截图; 右:草图矩形.
注意:
使用非零值时spread
,它会根据bounds
CALayer 的路径对路径进行硬编码.如果图层的边界发生变化,您需要applySketchShadow()
再次调用该方法.
你可以尝试这个......你可以玩这些值.这shadowRadius
决定了模糊的数量.shadowOffset
决定阴影的去向.
Swift 2.0
let radius: CGFloat = demoView.frame.width / 2.0 //change it to .height if you need spread for height let shadowPath = UIBezierPath(rect: CGRect(x: 0, y: 0, width: 2.1 * radius, height: demoView.frame.height)) //Change 2.1 to amount of spread you need and for height replace the code for height demoView.layer.cornerRadius = 2 demoView.layer.shadowColor = UIColor.blackColor().CGColor demoView.layer.shadowOffset = CGSize(width: 0.5, height: 0.4) //Here you control x and y demoView.layer.shadowOpacity = 0.5 demoView.layer.shadowRadius = 5.0 //Here your control your blur demoView.layer.masksToBounds = false demoView.layer.shadowPath = shadowPath.CGPath
Swift 3.0
let radius: CGFloat = demoView.frame.width / 2.0 //change it to .height if you need spread for height let shadowPath = UIBezierPath(rect: CGRect(x: 0, y: 0, width: 2.1 * radius, height: demoView.frame.height)) //Change 2.1 to amount of spread you need and for height replace the code for height demoView.layer.cornerRadius = 2 demoView.layer.shadowColor = UIColor.black.cgColor demoView.layer.shadowOffset = CGSize(width: 0.5, height: 0.4) //Here you control x and y demoView.layer.shadowOpacity = 0.5 demoView.layer.shadowRadius = 5.0 //Here your control your blur demoView.layer.masksToBounds = false demoView.layer.shadowPath = shadowPath.cgPath
传播的例子
创建基本阴影
demoView.layer.cornerRadius = 2 demoView.layer.shadowColor = UIColor.blackColor().CGColor demoView.layer.shadowOffset = CGSizeMake(0.5, 4.0); //Here your control your spread demoView.layer.shadowOpacity = 0.5 demoView.layer.shadowRadius = 5.0 //Here your control your blur
Swift 2.0中的基本阴影示例
在Swift 4中使用IBDesignable和IBInspectable绘制草图阴影
逐个草图和XCODE
码
@IBDesignable class ShadowView: UIView { @IBInspectable var shadowColor: UIColor? { get { if let color = layer.shadowColor { return UIColor(cgColor: color) } return nil } set { if let color = newValue { layer.shadowColor = color.cgColor } else { layer.shadowColor = nil } } } @IBInspectable var shadowOpacity: Float { get { return layer.shadowOpacity } set { layer.shadowOpacity = newValue } } @IBInspectable var shadowOffset: CGPoint { get { return CGPoint(x: layer.shadowOffset.width, y:layer.shadowOffset.height) } set { layer.shadowOffset = CGSize(width: newValue.x, height: newValue.y) } } @IBInspectable var shadowBlur: CGFloat { get { return layer.shadowRadius } set { layer.shadowRadius = newValue / 2.0 } } @IBInspectable var shadowSpread: CGFloat = 0 { didSet { if shadowSpread == 0 { layer.shadowPath = nil } else { let dx = -shadowSpread let rect = bounds.insetBy(dx: dx, dy: dx) layer.shadowPath = UIBezierPath(rect: rect).cgPath } } } }
输出值
如何使用它
这段代码对我很有用:
yourView.layer.shadowOpacity = 0.2 // opacity, 20% yourView.layer.shadowColor = UIColor.black.cgColor yourView.layer.shadowRadius = 2 // HALF of blur yourView.layer.shadowOffset = CGSize(width: 0, height: 2) // Spread x, y yourView.layer.masksToBounds = false