好的,这就是它的发展方式。
灰色区域是UIView,并用CAShapeLayer
掩盖它。我添加了两个UIBezierPath
并使用Even Odd Rule
删除了该灰色区域的一部分。这就是为什么它显示一条线,好像它在左边展示了一个半圆。
红色背景只是容器视图。
现在我的问题是,当我为UIView
设置动画时,就好像使用动画UIView
无法正确更新蒙版。
这是UIView
动画部分:
func didCompleteItem() {
self.bar.plainProgressBarLeftAnchor?.constant = self.bar.bounds.width * (self.completedItemCount*self.barMeterMultiplier) / self.bar.bounds.width - self.bar.meterCornerRadius
UIView.animate(withDuration: 1.0, delay: 0, usingSpringWithDamping: 1.0, initialSpringVelocity: 1.0, options: .curveEaseInOut, animations: {
self.bar.layoutIfNeeded()
}, completion: nil)
}
现在,如果您需要了解layoutSubviews
是如何创建的,那么这是CAShapeLayer
部分。
override func layoutSubviews() {
super.layoutSubviews()
backgroundColor = GradientColor(.leftToRight, frame: self.bounds, colors: GradientFlatRed())
layer.masksToBounds = true
layer.cornerRadius = meterCornerRadius
createMask()
}
var shapeLayer: CAShapeLayer = CAShapeLayer()
func createMask() {
let bPath = UIBezierPath(roundedRect: plainProgressBar.bounds, byRoundingCorners: [.topRight, .bottomRight], cornerRadii: CGSize(width: 0, height: 0))
let semiCircle = UIBezierPath(arcCenter: CGPoint(x: bounds.origin.x, y: plainProgressBar.bounds.origin.y+meterCornerRadius), radius: meterCornerRadius, startAngle: 3 * CGFloat.pi / 2, endAngle: CGFloat.pi / 2, clockwise: true)
shapeLayer.frame = layer.bounds
bPath.append(semiCircle)
shapeLayer.path = bPath.cgPath
shapeLayer.fillRule = kCAFillRuleEvenOdd
plainProgressBar.layer.mask = shapeLayer
}