UIDynamic 中的三個重要概念
?Dynamic Animator:動畫者鬼佣,為動力學(xué)元素提供物理學(xué)相關(guān)的能力及動畫橙弱,同時為這些元素提供相關(guān)的上下文鸵闪,是動力學(xué)元素與底層iOS物理引擎之間的中介,將Behavior對象添加到Animator即可實現(xiàn)動力仿真
?UIDynamicBehavior:仿真行為侨颈,是動力學(xué)行為的父類硬贯,基本的動力學(xué)行為類UIGravityBehavior焕襟、UICollisionBehavior、UIAttachmentBehavior饭豹、UISnapBehavior鸵赖、UIPushBehavior以及UIDynamicItemBehavior均繼承自該父類
?Dynamic Animator Item:動力學(xué)元素(動力項),是任何遵守了UIDynamicItem協(xié)議的對象拄衰,從iOS7.0開始它褪,UIView和UICollectionViewLayoutAttributes默認實現(xiàn)該協(xié)議。如果自定義的對象實現(xiàn)了該協(xié)議翘悉,即可通過Dynamic Animator實現(xiàn)物理仿真
UIDynamic 相關(guān)類型介紹
?UIDynamicAnimator(類—動畫者)
?UIDynamicBehavior(抽象類—動畫行為)
–UIGravityBehavior
–UICollisionBehavior
–UIPushBehavior
–UISnapBehavior
–UIAttachmentBehavior
–UIDynamicItemBehavior(類-執(zhí)行動畫物體自身的行為)
?UIDynamicItem(協(xié)議-動力項協(xié)議)
–@property(nonatomic,readwrite)CGPointcenter;
–@property(nonatomic,readonly)CGRectbounds;(只讀)
@property(nonatomic,readwrite)CGAffineTransformtransform;
重力行為(Gravity)
重力行為用于給動力學(xué)元素指定一個重力向量
// 實例化一個重力行為茫打,并傳入需要做動力仿真的對象view
UIGravityBehavior *gravity = [[UIGravityBehavior alloc] initWithItems:@[view]];
// 將重力行為添加到animator
[animatoraddBehavior:gravity];
碰撞行為(Collision)
?碰撞行為用于指定一組動力學(xué)元素,在指定的邊界范圍內(nèi),可以彼此發(fā)生碰撞
?碰撞行為提供了代理方法老赤,可用于在物體碰撞前轮洋、后對動力學(xué)元素做碰撞后續(xù)的處理
// 實例化碰撞行為,并指定view參與碰撞
UICollisionBehavior *collsion = [[UICollisionBehavior alloc] initWithItems:@[view]];
// 指定是否啟用參照系的邊界
collsion.translatesReferenceBoundsIntoBoundary = YES;
// 將碰撞行為添加至animator
[animatoraddBehavior:collsion];
設(shè)置不可見碰撞邊界并跟蹤碰撞情況
// 5.1 設(shè)置障礙物碰撞邊界
CGPoint toPoint =CGPointMake(barrier.frame.origin.x+barrier.frame.size.width,barrier.frame.origin.y + barrier.frame.size.height);
[collision addBoundaryWithIdentifier:@"barrier" fromPoint:barrier.frame.origin toPoint:toPoint];
// 6. 設(shè)置物體的彈性系數(shù)
UIDynamicItemBehavior *item = [[UIDynamicItemBehavior alloc] initWithItems:@[view]];
[item setElasticity:0.5f];
// 7. 監(jiān)聽碰撞動作
collision.action = ^{
NSLog(@"%@",NSStringFromCGRect(view.frame));
};
在碰撞通知代理方法中修改視圖顏色
UIView *view = (UIView *)item;
// 動畫改變碰撞物體的顏色
NSString *ID = [NSString stringWithFormat:@"%@", identifier];
if ([ID isEqualToString:@"barrier"]) {
view.backgroundColor= [UIColorgreenColor];
[UIViewanimateWithDuration:0.3fanimations:^{
view.backgroundColor= [UIColorblueColor];
}];
}
UIKit Dynamic 只能做矩形的碰撞
甩行為(Snap行為)
?甩行為可以將視圖通過動畫甩(吸附)到某個點上
?初始化設(shè)定一下UISnapBehavior的initWithItem:snapToPoint:即可
?屬性:
damping:振幅大小抬旺,默認為0.5f
// 刪除之前的吸附行為
[_animator removeBehavior:_snap];
CGPoint location = [sender locationInView:self.view];
_snap = [[UISnapBehavior alloc] initWithItem:_boxImageView snapToPoint:location];
// 生成隨機振幅
CGFloat
damping = arc4random_uniform(10) + 1;
_snap.damping = damping / 10.0f;
[_animator addBehavior:_snap];
附著行為(Attachment)
?附著行為描述一個視圖與一個錨點或者另一個視圖相連接的情況
?附著行為描述的是兩點之間的連接情況弊予,可以模擬剛性或者彈性連接
?在多個物體間設(shè)定多個UIAttachmentBehavior,可以模擬多物體連接
?屬性:
?attachedBehaviorType:連接類型(連接到錨點或視圖)
?items:連接視圖數(shù)組
?anchorPoint:連接錨點
?length:距離連接錨點的距離
?只要設(shè)置了以下兩個屬性开财,即為彈性連接
?damping:振幅大小
frequency:振動頻率
剛性附加行為
if (UIGestureRecognizerStateBegan == sender.state) {
//創(chuàng)建附加剛性行為
CGPointanchorPoint=CGPointMake(_boxImageView.center.x,_boxImageView.center.y);
_attachment=[[UIAttachmentBehavioralloc]initWithItem:_boxImageViewoffsetFromCenter:UIOffsetMake(-25.0, -25.0)attachedToAnchor:anchorPoint];
[_animatoraddBehavior:_attachment];
}
else if (UIGestureRecognizerStateChanged == sender.state) {
//設(shè)置行為的錨點
[_attachmentsetAnchorPoint:[senderlocationInView:self.view]];
}
else if (UIGestureRecognizerStateEnded == sender.state) {
//刪除附加行為
[_animatorremoveBehavior:_attachment];
}
注:偏移點偏移一定位置汉柒,可以使得在拖動手指時產(chǎn)生旋轉(zhuǎn)的效果
彈性附加行為
if (UIGestureRecognizerStateBegan == sender.state) {
CGPointanchor =CGPointMake(_boxImageView.center.x,_boxImageView.center.y-100);
_attachment= [[UIAttachmentBehavioralloc]initWithItem:_boxImageViewattachedToAnchor:anchor];
[_animatoraddBehavior:_attachment];
[_attachmentsetFrequency:1.0f];
[_attachmentsetDamping:0.1f];
}
else if (UIGestureRecognizerStateChanged == sender.state) {
[_attachmentsetAnchorPoint:[senderlocationInView:self.view]];
}
else if (UIGestureRecognizerStateEnded == sender.state) {
[_animatorremoveBehavior:_attachment];
}
注:設(shè)置了frequency和damping屬性,創(chuàng)建的即為彈性附加
推行為(Push)
?推行為可以為一個視圖施加一個作用力责鳍,該力可以是持續(xù)的碾褂,也可以是一次性的
?可以設(shè)置力的大小,方向和作用點等信息
?屬性:
?mode:推動類型(一次性或是持續(xù)推)
?angle:推動角度
magnitude:推動力量
施加一個力
// 計算兩點之間距離
CGFloat
distance = sqrtf(powf(p.x - _firstPoint.x, 2.0) + powf(p.y - _firstPoint.y,
2.0));
CGFloat
angle = atan2(p.y - _firstPoint.y,p.x - _firstPoint.x);
_push.magnitude = distance / 20;
_push.angle = angle;
[_push setActive:YES];
動力學(xué)元素行為(DynamicItem)
?是一個輔助的行為历葛,用來設(shè)置運動學(xué)元素參與物理仿真過程中的參數(shù)正塌,如:彈性系數(shù)、摩擦系數(shù)恤溶、密度传货、阻力、角阻力以及是否允許旋轉(zhuǎn)等
?
?elasticity(彈性系數(shù)):決定了碰撞的彈性程度宏娄,比如碰撞時物體的彈性
?friction(摩擦系數(shù))
:決定了沿接觸面滑動時的摩擦力大小
?density(密度):跟size結(jié)合使用,計算物體的總質(zhì)量逮壁。質(zhì)量越大孵坚,物體加速或減速就越困難
?resistance(阻力):決定線性移動的阻力大小,與摩擦系數(shù)不同窥淆,摩擦系數(shù)只作用于滑動運動
?angularResistance(角阻力)
:決定旋轉(zhuǎn)運動時的阻力大小
?allowsRotation(允許旋轉(zhuǎn)):這個屬性很有意思卖宠,它在真實的物理世界沒有對應(yīng)的模型。設(shè)置這個屬性為NO物體就完全不會轉(zhuǎn)動忧饭,而無論施加多大的轉(zhuǎn)動力
UIDynamic中的物理學(xué)
?在傳統(tǒng)物理學(xué)中
–力的單位是牛頓(N = kg*m/s2)
–距離單位是米(m)
–時間單位是秒(s)
–質(zhì)量單位是千克(kg)
–加速度單位是m/s2扛伍,重力加速度約為:9.8m/s2
–速度單位是m/s
?UIDynamic中
–使用點來替代傳統(tǒng)物理學(xué)中的m
–一個點的的質(zhì)量為1g
–UI重力加速度定義為1000p/s2
UIDynamic參考文檔