【发布时间】:2018-06-07 11:51:11
【问题描述】:
我目前正在尝试向用户的 xp 栏添加动画。
如果我在 collectionViewController 中有动画,则动画加载良好(一次)。但是,如果我在 headerView 中有动画(因为我想在个人资料图片上添加栏),则该栏会多次启动:
这是我的代码(headerViewCell):
let shapeLayerXp = CAShapeLayer()
override func layoutSubviews() {
super.layoutSubviews()
showUserXp()
self.animateXp(toValue: 1)
}
func showUserXp() {
let center = profileImage.center
let circularPath = UIBezierPath(arcCenter: center, radius: 40, startAngle: -CGFloat.pi / 2, endAngle: 2 * CGFloat.pi, clockwise: true)
shapeLayerXp.path = circularPath.cgPath
let color = UIColor(red: 122 / 255, green: 205 / 255, blue: 186 / 255, alpha: 1)
shapeLayerXp.strokeColor = color.cgColor
shapeLayerXp.lineWidth = 4
shapeLayerXp.fillColor = UIColor.clear.cgColor
shapeLayerXp.lineCap = kCALineCapRound
shapeLayerXp.strokeEnd = 0
self.contentView.layer.addSublayer(shapeLayerXp)
}
func animateXp(toValue: Int) {
let basicAnimation = CABasicAnimation(keyPath: "strokeEnd")
basicAnimation.toValue = toValue
basicAnimation.duration = 2
basicAnimation.fillMode = kCAFillModeForwards
basicAnimation.isRemovedOnCompletion = false
shapeLayerXp.add(basicAnimation, forKey: "urSoBasic")
}
headerViewCell 是这样启动的:
override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
let headerViewCell = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "Header", for: indexPath) as! UserHeaderView
// ....
return cell
}
【问题讨论】:
-
您在
layoutSubViews()中调用showUserXp()和animateXp(),因此每次系统决定布局标题单元格时,动画都会再次发生。显然,当集合视图滚动时会发生这种情况,但也可能在其他时间发生,例如设备轮换,标题单元重用。你想达到什么目的?是否应该仅在控制器首次显示时才进行动画处理,然后仅在其他特定时间进行动画处理? -
我只想在 viewController 启动时(一次)为栏设置动画
-
这个控制器只有一个标题单元格吗?单元格是如何定义的(故事板、xib 文件、手动)?
-
我编辑了我的第一篇文章,向您展示如何定义单元格
标签: ios swift animation swift3 uicollectionviewcell