3D翻转
因为有3D翻转动画效果的UIView
比较多,而且有UILabel
也有UIImageView
,所以我们可以提炼成一个方法,将目标UIView
和数据源作为参数:
func cubeAnimate(targetView: UIView, flightInfo: String) { // 判断UIView的具体实现类 if targetView.isKindOfClass(UILabel) { let virtualTargetView = targetView as! UILabel // 复制UIView,作为底面 let viewCopy = UILabel(frame: virtualTargetView.frame) viewCopy.alpha = 0 viewCopy.text = flightInfo viewCopy.font = virtualTargetView.font viewCopy.textAlignment = virtualTargetView.textAlignment viewCopy.textColor = virtualTargetView.textColor viewCopy.backgroundColor = UIColor.clearColor() // 设置底面UIView的初始位置和高度 viewCopy.transform = CGAffineTransformConcat(CGAffineTransformMakeScale(1.0, 0.1), CGAffineTransformMakeTranslation(1.0, viewCopy.frame.height / 2)) self.topView.addSubview(viewCopy) UIView.animateWithDuration(2, animations: { // 执行UIView和UIViewCopy的动画 virtualTargetView.transform = CGAffineTransformConcat(CGAffineTransformMakeScale(1.0, 0.1), CGAffineTransformMakeTranslation(1.0, -virtualTargetView.frame.height / 2)) virtualTargetView.alpha = 0 viewCopy.alpha = 1 viewCopy.transform = CGAffineTransformIdentity }, completion: { _ in // 当动画执行完毕后,将UIViewCopy的信息赋值给UIView,并还原UIView的状态,即与UIViewCopy相同的状态,然后移除UIViewCopy virtualTargetView.alpha = 1 virtualTargetView.text = viewCopy.text virtualTargetView.transform = CGAffineTransformIdentity viewCopy.removeFromSuperview() }) } else if targetView.isKindOfClass(UIImageView) { let virtualTargetView = targetView as! UIImageView let viewCopy = UIImageView(frame: virtualTargetView.frame) viewCopy.alpha = 0 viewCopy.image = UIImage(named: flightInfo) viewCopy.transform = CGAffineTransformConcat(CGAffineTransformMakeScale(1.0, 0.1), CGAffineTransformMakeTranslation(1.0, viewCopy.frame.height / 2)) self.topView.addSubview(viewCopy) UIView.animateWithDuration(2, animations: { virtualTargetView.transform = CGAffineTransformConcat(CGAffineTransformMakeScale(1.0, 0.1), CGAffineTransformMakeTranslation(1.0, -virtualTargetView.frame.height / 2)) virtualTargetView.alpha = 0 viewCopy.alpha = 1 viewCopy.transform = CGAffineTransformIdentity }, completion: { _ in virtualTargetView.alpha = 1 virtualTargetView.image = viewCopy.image virtualTargetView.transform = CGAffineTransformIdentity viewCopy.removeFromSuperview() }) } } |
具体有这么几个步骤:
- 判断
UIView
的具体实现类,判断是UILabel
还是UIImageView
。 - 复制一份
UIView
,作为底面。 - 设置
UIViewCopy
的初始位置和高度。 - 执行UIView
和
UIViewCopy`的动画。 - 当动画执行完毕后,将
UIViewCopy
的信息赋值给UIView
,并还原UIView
的状态,即与UIViewCopy
相同的状态,然后移除UIViewCopy
。