最近有一个非常棒的演讲“Swift值得一试!”
在其中Adam Bell提出:
在全世界抛弃了拟真设计(skeumorphism)的时候
我们应当拾回iOS应用所丢失的魔力
而我完全同意他的观点
▼
iOS的魔力通常体现为交互式的手势动画——每当目睹屏幕上的操作完美回应你的触控时,这种感觉非常奇妙。还记得*次见到惯性滚动(inertial scrolling)效果、旧版Twitter iPad版、以及53公司的Paper软件时我们的反应么?
交互手势动画在使用时还是很费劲的,通常*括很多不同的插值类型,在本文中我打算将其做以简化。
插值初接触
插值(Interpolate)是用于创建交互式手势动画的全新Swift插值框架,而关键在于:所有动画归根结底都是插值。移动就是从一个CGPoint到另一个的插值,而色彩变化则是两个UIColor之间的插值,依此类推。
目前插值能够加入的类型极其丰富(并且还有计划要加入更多类型)。在使用时,只要创建插值对象,赋予其起始值与结束值,并将其应用在闭*内的目标视图上即可。之后只需从手势识别器上获取相应的值,再将其提供给插值对象就可以了。
代码如下:
// Create interpolation object
let colorChange = Interpolate(from: UIColor.whiteColor(), to: UIColor.redColor(), apply: { [weak self] (color) in
self?.view.backgroundColor = color
})
// For a gesture recognizer or delegate that reports every step of its progress (e.g. UIPanGestureRecognizer or a ScrollViewDidScroll) you can just apply the percentage directly to the Interpolate object
@IBAction func handlePan(recognizer: UIPanGestureRecognizer) {
let translation = recognizer.translationInView(self.view)
let translatedCenterY = view.center.y + translation.y
let progress = translatedCenterY / self.view.bounds.size.height
colorChange.progress = progress
}
// For other types of gesture recognizers that only report a beginning and an end (e.g. a UILongPressGestureRecognizer), you can animate directly to a target progress value with a given duration.
@IBAction func handleLongPress(recognizer: UILongPressGestureRecognizer) {
switch recognizer.state {
case .Began:
colorChange.animate(1.0, duration: 0.3)
case .Cancelled, .Ended, .Failed:
colorChange.animate(0.0, duration: 0.3)
default: break
}
}
// To remove
colorChange.invalidate()
插值不仅可以应用在简单的线性插入上
还能让动画过渡更平滑、效果更丰富
插值支持下列这些函数:
EaseIn、EaseOut、EaseInOut以及Spring
甚至支持自定义插值函数(通过协议)
让我们来尝试更多神奇的应用吧!