Итак, вот как это происходит.
Серая область — это 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
}
layoutLayer()
(эквивалент layoutSubView) это может помочь исправить. - person Larme   schedule 09.11.2017layoutLayer()
ее решать? Связано ли это с жизненным циклом представления? - person rocky raccoon   schedule 09.11.2017