UIDynamicAnimator 是iOS7之后引入的一個動態(tài)庫,用來模擬實現(xiàn)現(xiàn)實世界的物理模型熄云,實現(xiàn)的動畫有動感。主要模擬的物理行為有:UIGravityBehavior(重力)拖云,UIAttachmentBehavior(吸附)摘仅,UISnapBehavior(震蕩),UIPushBehavior(推動)叮叹,UICollisionBehavior(碰撞)艾栋,UIDynamicItemBehavior(配置一些公用的屬性,與其他的Dynamic Behavior共同配合)蛉顽。
本文主要介紹一個未完待續(xù)的小動畫蝗砾,結合UIGravityBehavior、UISnapBehavior携冤、UICollisionBehavior實現(xiàn)悼粮。
一、初始化UI
- (void)initSubViews {- (void)initSubViews {
[self.view addSubview:self.weiImageView];
[self.view addSubview:self.wanImageView];
[self.view addSubview:self.daiImageView];
[self.view addSubview:self.xuImageView];
[self.view addSubview:self.longmaoImageView];
_weiImageView.cy_originY = -100;
_wanImageView.cy_originY = -100;
_daiImageView.cy_originY = -100;
_xuImageView.cy_originY = -100;
}
初始化ImageView的時候曾棕,設置ImageView的frame是你想設置的位置扣猫,這里又設置各個frame的origin.y為0是為了實現(xiàn)掉落效果。
二翘地、實現(xiàn)動畫
- (void)animation {
//實現(xiàn)龍貓的晃動動畫申尤,設置龍貓不間斷晃動
CAKeyframeAnimation *animation = [CAKeyframeAnimation animation];
animation.keyPath = @"transform.rotation";
animation.values = @[@(-20 / 180.0 * M_PI), @(10 / 180.0 * M_PI), @(-20 /180.0 * M_PI)];
animation.removedOnCompletion = NO;
animation.duration = 0.5;
animation.repeatCount = MAXFLOAT;
[self.longmaoImageView.layer addAnimation:animation forKey:nil];
//設置四個ImageView的吸附動畫癌幕,由初始位置吸附到各個ImageView的center位置,每個ImageView 的路徑不一樣
UISnapBehavior *snap = [[UISnapBehavior alloc] initWithItem:_weiImageView snapToPoint:weiInitialPoint];
snap.damping = 1.0;
UISnapBehavior *snap1 = [[UISnapBehavior alloc] initWithItem:_wanImageView snapToPoint:wanInitialPoint];
snap1.damping = 1.0;
UISnapBehavior *snap2 = [[UISnapBehavior alloc] initWithItem:_daiImageView snapToPoint:daiInitialPoint];
snap2.damping = 1.0;
UISnapBehavior *snap3 = [[UISnapBehavior alloc] initWithItem:_xuImageView snapToPoint:xuInitialPoint];
snap3.damping = 1.0;
//重力效果昧穿,聲明一個對象勺远,可以循環(huán)加載
UIGravityBehavior *gravity = [[UIGravityBehavior alloc] init];
[gravity addItem:_weiImageView];
[gravity addItem:_wanImageView];
[gravity addItem:_daiImageView];
[gravity addItem:_xuImageView];
//彈性效果,這里設置碰撞類型collisionMode為碰撞所有
UICollisionBehavior *collision = [[UICollisionBehavior alloc] init];
collision.collisionMode = UICollisionBehaviorModeEverything;
[collision addItem:_weiImageView];
[collision addItem:_wanImageView];
[collision addItem:_daiImageView];
[collision addItem:_xuImageView];
//初始化 self.animator时鸵,self.animator的ReferenceView是所有子類View的父View胶逢,承載所有動畫
//snap吸附動畫的發(fā)生通過線程設置延時,展現(xiàn)出的效果有節(jié)奏
self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self.animator addBehavior:snap];
});
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self.animator addBehavior:snap1];
});
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.8 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self.animator addBehavior:snap2];
});
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self.animator addBehavior:snap3];
});
}
三饰潜、細節(jié)補充
關于UICollisionBehavior的collisionMode的三種效果初坠,可以參考文章
http://www.reibang.com/p/2ca3b16026a5
另外附上本文Demo地址,感興趣的小伙伴可以參考一下彭雾,如有不合理的地方歡迎指正某筐!