【发布时间】:2015-10-01 09:08:40
【问题描述】:
我正在创建一个我想在应用程序在线检索一些数据时使用的动画。这个想法是我连续有一些点,它们将被缩放到比它们的原始大小更小,然后返回到它们的原始大小,所有这些在每次缩放之间都有一个小的延迟。动画重复播放并使用自动反转模式。
为此,我使用核心图形方法创建了一些点,将它们添加到视图中并使用CGAffineTransformMakeTranslation 转换定位它们。然后我使用一个循环对它们进行延迟动画处理,并使用CGAffineTransformScale 转换进行缩放。
问题:我没有得到预期的动画(至少是我所期待的)。当点被缩放时,它们也会移回原来的位置。
有人能告诉我为什么在UIView 动画中存在平移转换,而我只是指定了缩放比例吗?
代码如下:
private var dots = [UIImage]()
public init(numberOfDots: Int, hexaColor: Int, dotDiameter: CGFloat = 30, animationDuration: NSTimeInterval = 1) {
self.dotDiameter = dotDiameter
self.animationDuration = animationDuration
for _ in 0 ..< numberOfDots {
dots.append(GraphicHelper.drawDisk(hexaColor, rectForDisk: CGRect(x: 0, y: 0, width: dotDiameter, height: dotDiameter), withStroke: false))
}
let spaceBetweenDisks: CGFloat = dotDiameter / 3
let viewWidth: CGFloat = CGFloat(numberOfDots) * dotDiameter + CGFloat(numberOfDots - 1) * spaceBetweenDisks
super.init(frame: CGRectMake(0, 0, viewWidth, dotDiameter))
setup()
}
private func setup() {
for (i, dot) in dots.enumerate() {
let dotImageView = UIImageView(image: dot)
addSubview(dotImageView)
let spaceBetweenDisks: CGFloat = dotDiameter / 3
let xOffset = CGFloat(i) * (dotDiameter + spaceBetweenDisks)
dotImageView.transform = CGAffineTransformMakeTranslation(xOffset, 0)
}
}
public func startAnimation() {
for i in 0 ..< self.dots.count {
let dotImageView: UIImageView = self.subviews[i] as! UIImageView
let transformBeforeAnimation = dotImageView.transform
let delay: NSTimeInterval = NSTimeInterval(i)/NSTimeInterval(self.dots.count) * animationDuration
UIView.animateWithDuration(animationDuration, delay: delay, options: [UIViewAnimationOptions.Repeat, UIViewAnimationOptions.Autoreverse], animations: {
dotImageView.transform = CGAffineTransformScale(dotImageView.transform, 0.05, 0.05)
}, completion: { finished in
dotImageView.transform = CGAffineTransformIdentity
dotImageView.transform = transformBeforeAnimation
})
}
}
编辑:
我找到了一个修复程序,但我不明白它是如何修复它的。所以如果有人能解释一下。
我添加了这两行:
dotImageView.transform = CGAffineTransformIdentity
dotImageView.transform = transformBeforeAnimation
startAnimation 中的这一行之前:
dotImageView.transform = CGAffineTransformScale(dotImageView.transform, 0.05, 0.05)
【问题讨论】:
标签: ios swift core-animation