阴影在具有自定义形状的视图上不可见

时间:2016-12-30 11:42:16

标签: ios swift3 uibezierpath dropshadow

在我将imageview的形状更改为六边形之后,我的imageview阴影上的

是不可见的,这就是我如何改变imageView的形状:

extension UIView {


func makeHexagon(){

    let lineWidth: CGFloat = 3
    let path = UIBezierPath(roundedPolygonPathWithRect: self.bounds, lineWidth: lineWidth, sides: 6, cornerRadius: 1)

    let mask = CAShapeLayer()


    mask.path = path.cgPath
    mask.lineWidth = lineWidth
    mask.strokeColor = UIColor.clear.cgColor //controls the  stroke width
    mask.fillColor = UIColor.white.cgColor
    self.layer.mask = mask




    let border = CAShapeLayer()
    border.path = path.cgPath
    border.lineWidth = lineWidth
    border.strokeColor = UIColor.black.cgColor
    border.fillColor = UIColor.clear.cgColor


    self.layer.addSublayer(border)

}

}

............................

 extension UIBezierPath {

    convenience init(roundedPolygonPathWithRect rect: CGRect, lineWidth: CGFloat, sides: NSInteger, cornerRadius: CGFloat) {

        self.init()



        let theta = CGFloat(2.0 * M_PI) / CGFloat(sides)
        let offSet = CGFloat(cornerRadius) / CGFloat(tan(theta/2.0))
        let squareWidth = min(rect.size.width, rect.size.height)

        var length = squareWidth - lineWidth

        if sides%4 != 0 {
            length = length * CGFloat(cos(theta / 2.0)) + offSet/2.0
        }
        let sideLength = length * CGFloat(tan(theta / 2.0))

        var point = CGPoint(x: squareWidth / 2.0 + sideLength / 2.0 - offSet, y: squareWidth - (squareWidth - length) / 2.0)
        var angle = CGFloat(M_PI)
        move(to: point)

        for _ in 0 ..< sides {
            point = CGPoint(x: point.x + CGFloat(sideLength - offSet * 2.0) * CGFloat(cos(angle)), y: point.y + CGFloat(sideLength - offSet * 2.0) * CGFloat(sin(angle)))
            addLine(to: point)

            let center = CGPoint(x: point.x + cornerRadius * CGFloat(cos(angle + CGFloat(M_PI_2))), y: point.y + cornerRadius * CGFloat(sin(angle + CGFloat(M_PI_2))))
            addArc(withCenter: center, radius:CGFloat(cornerRadius), startAngle:angle - CGFloat(M_PI_2), endAngle:angle + theta - CGFloat(M_PI_2), clockwise:true)

            point = currentPoint // we don't have to calculate where the arc ended ... UIBezierPath did that for us
            angle += theta
        }

        close()
    }
}

使用扩展名:

        firstImageView.makeHexagon()

以下是我在ImageView上添加阴影效果的方法:

     firstImageView.layer.contentsScale = UIScreen.main.scale;
    firstImageView.layer.shadowColor = UIColor.black.cgColor;
    firstImageView.layer.shadowOffset = CGSize.zero;
    firstImageView.layer.shadowRadius = 5.0;
    firstImageView.layer.shadowOpacity = 2;
    firstImageView.layer.masksToBounds = false;
    firstImageView.clipsToBounds = false;

任何人都可以指出在更改imageView的形状后我的阴影是不可见的???

1 个答案:

答案 0 :(得分:1)

您已将视图剪裁为六边形,因此要显示阴影,您必须在ShapeLayer上设置阴影。

let border = CAShapeLayer()
border.path = path.cgPath
border.lineWidth = lineWidth
border.strokeColor = UIColor.black.cgColor
border.fillColor = UIColor.clear.cgColor
border.shadowColor = UIColor.red.cgColor;
border.shadowRadius = 5.0;
border.shadowOpacity = 2;