代码之家  ›  专栏  ›  技术社区  ›  Prashant Tukadiya

在第一次滚动PageViewController之前,UIImageView掩码层不会从角落来

  •  1
  • Prashant Tukadiya  · 技术社区  · 7 年前

    我想达到这个结果

    enter image description here

    所以我需要在底部加上面具

    enter image description here

     private func setupImageCutPath () {
            let path = UIBezierPath()
            path.move(to: .zero)
            path.addLine(to: CGPoint(x: 0  , y: self.imgView.frame.height))
            path.addLine(to: CGPoint(x: self.imgView.frame.width  , y: self.imgView.frame.height - imageCutAwayPart))
            path.addLine(to: CGPoint(x: self.imgView.frame.width, y: 0))
    
    
            // Multiple tried to check from where masking is comming
            self.maskLayer.fillColor = UIColor.gray.cgColor
            self.maskLayer.lineWidth = 1.0
            self.maskLayer.borderColor = UIColor.gray.cgColor
            self.maskLayer.borderWidth = 1.0
            self.maskLayer.path = path.cgPath
    
    
            self.imgView.layer.mask = self.maskLayer
    
        }
    

    第一次滚动后我得到正确的结果

    我不明白我缺少什么帮助?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Prashant Tukadiya    7 年前

    我解决了问题

        path.move(to: .zero)
        /* THIS HELPLS ME */ path.addLine(to: CGPoint(x: 0  , y: self.imgView.frame.height  -  imageCutAwayPart / 2 ))
        path.addLine(to: CGPoint(x: self.imgView.frame.width   , y: self.imgView.frame.height - imageCutAwayPart))
        path.addLine(to: CGPoint(x: self.imgView.frame.width, y: 0))
    

    但我不明白我为什么要搬家 CGPoint(x: 0 , y: self.imgView.frame.height - imageCutAwayPart / 2 ) 而不是这个 CGPoint(x: 0 , y: self.imgView.frame.height)

    enter image description here

    编辑

    故事中有个愚蠢但聪明的错误

    错误是有包含屏幕截图中显示的标签的UIView。可见的部分是UIView,我认为它的掩蔽工作不正常。仍然有一个问题,第一次在pageview控制器掩码是不正确的,但滚动一次后,它是完美的。

    EDIT2感谢@DonMag

    class CutOfImageView:UIImageView {
        let imageCutAwayPart:CGFloat = 80
        let maskLayer = CAShapeLayer()
    
        override func layoutSubviews() {
            super.layoutSubviews()
            self.setupImageCutPath()
            self.layer.mask = self.maskLayer
    
        }
    
        private func setupImageCutPath () {
            let path = UIBezierPath()
            path.move(to: .zero)
            path.addLine(to: CGPoint(x: 0  , y: self.frame.height ))
            path.addLine(to: CGPoint(x: self.frame.width   , y: self.frame.height - imageCutAwayPart))
            path.addLine(to: CGPoint(x: self.frame.width, y: 0))
            path.close()
            self.maskLayer.path = path.cgPath
    
    
    
        }
    }