我要达到这个结果
所以我需要在底部添加 mask ,但这是我得到的
我试过的代码
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
}
滚动后我第一次得到正确的结果
我不明白我错过了什么任何帮助?
最佳答案
我用
解决了问题 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,我认为它的 mask 无法正常工作。仍然存在第一次在页面 View Controller 掩码中不正确但滚动一次后它是完美的问题。
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
}
}
关于ios - UIImageView mask 层不来自角落直到滚动 PageViewController 第一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53779142/