在我的UICollectionViewCell中,我通过UIBezierPath添加了一个边框,动画如下所示。
class AnimalSelectionCollectionCell: UICollectionViewCell {
...
let shapeLayer: CAShapeLayer = CAShapeLayer()
override func layoutSubviews() {
super.layoutSubviews()
let path: UIBezierPath = UIBezierPath(
roundedRect: contentView.bounds.inset(by: UIEdgeInsets(top: 2, left: 2, bottom: 2, right: 2)),
byRoundingCorners: .allCorners, cornerRadii: CGSize(width: contentView.bounds.size.width, height: 0.0))
shapeLayer.path = path.cgPath
}
func setData() {
...
shapeLayer.lineWidth = 1.0
shapeLayer.fillColor = UIColor.clear.cgColor
contentView.layer.addSublayer(shapeLayer)
}
func startAnimation() {
shapeLayer.strokeColor = AppColors.Text.selectedName.cgColor
let animation: CABasicAnimation = CABasicAnimation(keyPath: "strokeEnd")
animation.fromValue = 0.0
animation.toValue = 1.0
animation.duration = 0.5
shapeLayer.add(animation, forKey: "myStroke")
}
}
在选择UICollectionViewCell
时,我调用startAnimation()
方法,用动画绘制边框。现在,再次选择时,我想以相反的顺序(即从1.0到0.0)删除带有动画的边框。
如何删除带有动画的绘制路径?
1条答案
按热度按时间cwxwcias1#
假设
allowsMultipleSelection
为真,您可以检查isSelected
并根据它执行不同的操作:还可以考虑重写
isSelected
并将此逻辑放在其didSet
中,而不是使用startAnimation
函数。isSelected
将由UIKit自动设置。然后,将原始代码放入
showSelectionAnimation
中以显示选择动画。对于取消选择动画,执行类似的操作,但颠倒fromValue
和toValue
。在动画结束时,还应将笔划颜色设置回透明,以便所有内容都返回到调用showSelectionAnimation
之前的状态。