【发布时间】:2019-11-21 17:32:47
【问题描述】:
我想使用UIBezierPath() 和CAShapeLayer() 在我的表格视图单元格中截断容器视图的上部和下部。代码如下:
func cutView() {
let containerViewHeight: CGFloat = containerView.frame.height
let headerCut: CGFloat = 50
let newHeight = containerViewHeight - headerCut/2
let newHeaderUpperLayer = CAShapeLayer()
let newHeaderLowerLayer = CAShapeLayer()
newHeaderUpperLayer.fillColor = UIColor.black.cgColor
newHeaderLowerLayer.fillColor = UIColor.black.cgColor
containerView.layer.mask = newHeaderUpperLayer
containerView.layer.mask = newHeaderLowerLayer
let getViewFrame = CGRect(x: 0, y: -newHeight, width: containerView.bounds.width, height: containerViewHeight)
let cutDirectionUpper = UIBezierPath()
let cutDirectionLower = UIBezierPath()
cutDirectionUpper.move(to: CGPoint(x: 0, y: 0))
cutDirectionUpper.addLine(to: CGPoint(x: getViewFrame.width, y: headerCut))
cutDirectionUpper.addLine(to: CGPoint(x: getViewFrame.width, y: getViewFrame.height))
cutDirectionUpper.addLine(to: CGPoint(x: 0, y: getViewFrame.height))
cutDirectionLower.move(to: CGPoint(x: 0, y: 0))
cutDirectionLower.addLine(to: CGPoint(x: getViewFrame.width, y: 0))
cutDirectionLower.addLine(to: CGPoint(x: getViewFrame.width, y: getViewFrame.height))
cutDirectionLower.addLine(to: CGPoint(x: 0, y: getViewFrame.height - headerCut))
newHeaderUpperLayer.path = cutDirectionUpper.cgPath
newHeaderLowerLayer.path = cutDirectionLower.cgPath
}
它单独工作,但不能一起工作。我在这里缺少什么?任何建议将不胜感激。提前致谢。
如果我单独运行它,它的工作原理是这样的:
但我想要的是这样的:
使用组合UIBezierPath():
func cutView() {
let containerViewHeight: CGFloat = containerView.frame.height
let headerCut: CGFloat = 50
let newHeight = containerViewHeight - headerCut/2
let newHeaderLayer = CAShapeLayer()
newHeaderLayer.fillColor = UIColor.black.cgColor
containerView.layer.mask = newHeaderLayer
let getViewFrame = CGRect(x: 0, y: -newHeight, width: containerView.bounds.width, height: containerViewHeight)
let cutDirectionLower = UIBezierPath()
let cutDirectionUpper = UIBezierPath()
cutDirectionUpper.move(to: CGPoint(x: 0, y: 0))
cutDirectionUpper.addLine(to: CGPoint(x: getViewFrame.width, y: headerCut))
cutDirectionUpper.addLine(to: CGPoint(x: getViewFrame.width, y: getViewFrame.height))
cutDirectionUpper.addLine(to: CGPoint(x: 0, y: getViewFrame.height))
cutDirectionLower.move(to: CGPoint(x: 0, y: 0))
cutDirectionLower.addLine(to: CGPoint(x: getViewFrame.width, y: 0))
cutDirectionLower.addLine(to: CGPoint(x: getViewFrame.width, y: getViewFrame.height))
cutDirectionLower.addLine(to: CGPoint(x: 0, y: getViewFrame.height - headerCut))
cutDirectionUpper.append(cutDirectionLower)
newHeaderLayer.path = cutDirectionUpper.cgPath
}
使用组合CGMutablePath():
func cutView() {
let containerViewHeight: CGFloat = containerView.frame.height
let headerCut: CGFloat = 50
let newHeight = containerViewHeight - headerCut/2
let newHeaderLayer = CAShapeLayer()
let combinedPath = CGMutablePath()
newHeaderLayer.fillColor = UIColor.black.cgColor
containerView.layer.mask = newHeaderLayer
let getViewFrame = CGRect(x: 0, y: -newHeight, width: containerView.bounds.width, height: containerViewHeight)
let cutDirectionLower = UIBezierPath()
let cutDirectionUpper = UIBezierPath()
cutDirectionUpper.move(to: CGPoint(x: 0, y: 0))
cutDirectionUpper.addLine(to: CGPoint(x: getViewFrame.width, y: headerCut))
cutDirectionUpper.addLine(to: CGPoint(x: getViewFrame.width, y: getViewFrame.height))
cutDirectionUpper.addLine(to: CGPoint(x: 0, y: getViewFrame.height))
cutDirectionLower.move(to: CGPoint(x: 0, y: 0))
cutDirectionLower.addLine(to: CGPoint(x: getViewFrame.width, y: 0))
cutDirectionLower.addLine(to: CGPoint(x: getViewFrame.width, y: getViewFrame.height))
cutDirectionLower.addLine(to: CGPoint(x: 0, y: getViewFrame.height - headerCut))
combinedPath.addPath(cutDirectionUpper.cgPath)
combinedPath.addPath(cutDirectionLower.cgPath)
newHeaderLayer.path = combinedPath
}
它们都去除了上下切口。我在这里缺少什么?
分别使用组合CGMutablePath()和组合UIBezierPath()的输出如下:
【问题讨论】:
-
你说的是
containerView.layer.mask = newHeaderUpperLayer; containerView.layer.mask = newHeaderLowerLayer。所以你完全扔掉第一个蒙版层,用第二个替换它。 -
@matt 感谢您的评论。但我想在同一个
containerView上绘制它们。那我该怎么办? -
我已经尝试过结合
CGMutablePath()和结合UIBezierPath(),但它们都不起作用,我在这里缺少什么? -
为什么不直接使用两个形状图层作为单个蒙版图层的子图层?
-
containerView.layer.mask?.addSublayer(newHeaderUpperLayer)&containerView.layer.mask?.addSublayer(newHeaderLowerLayer)相同的结果。newHeaderUpperLayer.addSublayer(newHeaderLowerLayer)&containerView.layer.mask?.addSublayer(newHeaderUpperLayer)相同的结果。两个切口都消失了。 :(
标签: ios swift uiview uibezierpath cashapelayer