最近在YT上看到一位大神写的个关于Facebook动画教程,尤其是这个屏幕动画(如下图)令我印象深刻。在他的代码下如此简单就可以实现,于是我整理了下他的教程,用Swift和OC分别做了个Demo。
22.gif
以下分别是Swift和OC写的Demo,并做了注释。有兴趣的学习下:
swift:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handelTap)))
}
func handelTap() {
(0...10).forEach { (_) in
generateAnimationViews()
}
}
fileprivate func generateAnimationViews() {
let image = drand48() > 0.5 ? #imageLiteral(resourceName: "thumbsUp") : #imageLiteral(resourceName: "heart")
let imageView = UIImageView(image: image)
let dimension = 20 + drand48() * 19
imageView.frame = CGRect(x: 0, y: 0, width: dimension, height: dimension)
let animation = CAKeyframeAnimation(keyPath: "position")
animation.path = customPath().cgPath
animation.duration = 2 + drand48() * 3
animation.fillMode = kCAFillModeForwards
animation.isRemovedOnCompletion = false
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)
imageView.layer.add(animation, forKey: nil)
view.addSubview(imageView)
}
}
func customPath() -> UIBezierPath {
let path = UIBezierPath()
path.move(to: CGPoint(x: 0, y: 200))
let endPoint = CGPoint(x: 500, y: 200)
let randomYShift = 200 + drand48() * 250
let cp1 = CGPoint(x: 100, y: 100 - randomYShift)
let cp2 = CGPoint(x: 200, y: 300 + randomYShift)
path.addCurve(to: endPoint, controlPoint1: cp1, controlPoint2: cp2)
return path
}
objective-c:
- (void)viewDidLoad {
[super viewDidLoad];
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleTap)];
[self.view addGestureRecognizer:tapGesture];
}
-(void)handleTap{
for (NSInteger i = 0; i < 10; i++) {
[self gengerateAnimationViews];
}
}
-(void)gengerateAnimationViews{
UIImage *image = [UIImage imageNamed:drand48() > 0.5 ? @"thumbsUp" : @"heart"];
UIImageView *imageView = [[UIImageView alloc]initWithImage:image];
NSInteger dimension = 20 + drand48() * 19;
imageView.frame = CGRectMake(0, 0, dimension, dimension);
CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
animation.path = [self customPath].CGPath;
animation.duration = 2 + drand48() * 3;
animation.fillMode = kCAFillModeForwards;
animation.removedOnCompletion = NO;
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
[imageView.layer addAnimation:animation forKey:nil];
[self.view addSubview:imageView];
}
-(UIBezierPath *)customPath {
UIBezierPath *path = [[UIBezierPath alloc]init];
[path moveToPoint:CGPointMake(0, 200)];
CGPoint endPoint = CGPointMake(500, 200);
NSInteger randomYShift = 200 + drand48() * 250;
CGPoint cp1 = CGPointMake(100, 100 - randomYShift);
CGPoint cp2 = CGPointMake(200, 300 + randomYShift);
[path addCurveToPoint:endPoint controlPoint1:cp1 controlPoint2:cp2];
return path;
}