【问题标题】:UIImageView Mask Layer not coming from corners Until Scroll PageViewController First timeUIImageView 掩码层不是来自角落,直到第一次滚动 PageViewController
【发布时间】:2020-05-11 15:30:59
【问题描述】:

我想达到这个结果

所以我需要在底部添加遮罩,但这里我得到了什么

我尝试过的代码

 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

    }

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

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

【问题讨论】:

  • 第一次显示时没有得到正确结果的原因是可能因为您在自动布局调整视图大小之前调用了setupImageCutPath()。如果你创建一个UIImageView 子类并更新layoutSubviews() 中的掩码,你会更好
  • @DonMag 感谢您的建议,我会试试这个
  • @DonMag 是的,这行得通! ,非常感谢你!!!

标签: ios swift uiimageview layer


【解决方案1】:

我解决了问题

    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)

如果有人知道,请发布作为答案,我一定会接受答案

编辑

Storybaord 中有一个愚蠢但聪明的错误

错误是 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



    }
}

【讨论】:

    猜你喜欢
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多