How to apply Curve at bottom of UIImageView?

前端 未结 2 1789
余生分开走
余生分开走 2020-12-28 10:22

I want to mask and add some curve at bottom of image view. i have try below code .

extension UIImage{
    var roundedImage: UIImage {
        let rect = CGRe         


        
相关标签:
2条回答
  • 2020-12-28 10:56

    As I said in my comment you need to make your own UIBezierPath adding a quad curve in the bottom part of your path, the curvedPercent will be how pronounced your curve will be, you can adjust it as you need it

    Custom UIImageView class

    @IBDesignable
    class CurvedUIImageView: UIImageView {
        
        private func pathCurvedForView(givenView: UIView, curvedPercent:CGFloat) ->UIBezierPath
        {
            let arrowPath = UIBezierPath()
            arrowPath.move(to: CGPoint(x:0, y:0))
            arrowPath.addLine(to: CGPoint(x:givenView.bounds.size.width, y:0))
            arrowPath.addLine(to: CGPoint(x:givenView.bounds.size.width, y:givenView.bounds.size.height))
            arrowPath.addQuadCurve(to: CGPoint(x:0, y:givenView.bounds.size.height), controlPoint: CGPoint(x:givenView.bounds.size.width/2, y:givenView.bounds.size.height-givenView.bounds.size.height*curvedPercent))
            arrowPath.addLine(to: CGPoint(x:0, y:0))
            arrowPath.close()
            
            return arrowPath
        }
        
        @IBInspectable var curvedPercent : CGFloat = 0{
            didSet{
                guard curvedPercent <= 1 && curvedPercent >= 0 else{
                    return
                }
                
                let shapeLayer = CAShapeLayer(layer: self.layer)
                shapeLayer.path = self.pathCurvedForView(givenView: self,curvedPercent: curvedPercent).cgPath
                shapeLayer.frame = self.bounds
                shapeLayer.masksToBounds = true
                self.layer.mask = shapeLayer
            }
        }
    
    }
    

    Result in Storyboard as is Designable

    For any kind of View, added curvedPercent parameter

    func pathCurvedForView(givenView: UIView, curvedPercent:CGFloat) ->UIBezierPath
        {
            let arrowPath = UIBezierPath()
            arrowPath.move(to: CGPoint(x:0, y:0))
            arrowPath.addLine(to: CGPoint(x:givenView.bounds.size.width, y:0))
            arrowPath.addLine(to: CGPoint(x:givenView.bounds.size.width, y:givenView.bounds.size.height))
            arrowPath.addQuadCurve(to: CGPoint(x:0, y:givenView.bounds.size.height), controlPoint: CGPoint(x:givenView.bounds.size.width/2, y:givenView.bounds.size.height-givenView.bounds.size.height*curvedPercent))
            arrowPath.addLine(to: CGPoint(x:0, y:0))
            arrowPath.close()
            
            return arrowPath
        }
    
    func applyCurvedPath(givenView: UIView,curvedPercent:CGFloat) {
        guard curvedPercent <= 1 && curvedPercent >= 0 else{
            return
        }
        
        let shapeLayer = CAShapeLayer(layer: givenView.layer)
        shapeLayer.path = self.pathCurvedForView(givenView: givenView,curvedPercent: curvedPercent).cgPath
        shapeLayer.frame = givenView.bounds
        shapeLayer.masksToBounds = true
        givenView.layer.mask = shapeLayer
    }
    

    How can I use it?

    self.applyCurvedPath(givenView: self.customView,curvedPercent: 0.5)
    

    Result for curvedPercent = 0.5

    Result for curvedPercent = 0.1

    Result for curvedPercent = 0.9

    UPDATE

    For inverted curve replace original pathCurvedForView method by this one

    func pathCurvedForView(givenView: UIView, curvedPercent:CGFloat) ->UIBezierPath
    {
        let arrowPath = UIBezierPath()
        arrowPath.move(to: CGPoint(x:0, y:0))
        arrowPath.addLine(to: CGPoint(x:givenView.bounds.size.width, y:0))
        arrowPath.addLine(to: CGPoint(x:givenView.bounds.size.width, y:givenView.bounds.size.height - (givenView.bounds.size.height*curvedPercent)))
        arrowPath.addQuadCurve(to: CGPoint(x:0, y:givenView.bounds.size.height - (givenView.bounds.size.height*curvedPercent)), controlPoint: CGPoint(x:givenView.bounds.size.width/2, y:givenView.bounds.size.height))
        arrowPath.addLine(to: CGPoint(x:0, y:0))
        arrowPath.close()
        
        return arrowPath
    }
    

    Result

    0 讨论(0)
  • 2020-12-28 10:59

    This will help you to solve your problem

    extension UIImageView{
          var roundedImage: UIImageView {
            let maskLayer = CAShapeLayer(layer: self.layer)
            let bezierPath = UIBezierPath()
            bezierPath.move(to: CGPoint(x:0, y:0))
            bezierPath.addLine(to: CGPoint(x:self.bounds.size.width, y:0))
            bezierPath.addLine(to: CGPoint(x:self.bounds.size.width, y:self.bounds.size.height))
            bezierPath.addQuadCurve(to: CGPoint(x:0, y:self.bounds.size.height), controlPoint: CGPoint(x:self.bounds.size.width/2, y:self.bounds.size.height-self.bounds.size.height*0.3))
            bezierPath.addLine(to: CGPoint(x:0, y:0))
            bezierPath.close()
            maskLayer.path = bezierPath.cgPath
            maskLayer.frame = self.bounds
            maskLayer.masksToBounds = true
            self.layer.mask = maskLayer
            return self
          }
        }
    

    Result

    0 讨论(0)
提交回复
热议问题