UIDynamic

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參考文檔


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市词裤,隨后出現(xiàn)的幾起案子刺洒,更是在濱河造成了極大的恐慌,老刑警劉巖吼砂,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逆航,死亡現(xiàn)場離奇詭異,居然都是意外死亡渔肩,警方通過查閱死者的電腦和手機因俐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人抹剩,你說我怎么就攤上這事撑帖。” “怎么了澳眷?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵胡嘿,是天一觀的道長。 經(jīng)常有香客問我境蔼,道長灶平,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任箍土,我火速辦了婚禮逢享,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吴藻。我一直安慰自己瞒爬,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布沟堡。 她就那樣靜靜地躺著侧但,像睡著了一般。 火紅的嫁衣襯著肌膚如雪航罗。 梳的紋絲不亂的頭發(fā)上禀横,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機與錄音粥血,去河邊找鬼柏锄。 笑死,一個胖子當(dāng)著我的面吹牛复亏,可吹牛的內(nèi)容都是我干的趾娃。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼缔御,長吁一口氣:“原來是場噩夢啊……” “哼抬闷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起耕突,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤笤成,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后眷茁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疹启,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年蔼卡,在試婚紗的時候發(fā)現(xiàn)自己被綠了喊崖。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挣磨。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖荤懂,靈堂內(nèi)的尸體忽然破棺而出茁裙,到底是詐尸還是另有隱情,我是刑警寧澤节仿,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布晤锥,位于F島的核電站,受9級特大地震影響廊宪,放射性物質(zhì)發(fā)生泄漏矾瘾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一箭启、第九天 我趴在偏房一處隱蔽的房頂上張望壕翩。 院中可真熱鬧,春花似錦傅寡、人聲如沸放妈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芜抒。三九已至,卻和暖如春托启,著一層夾襖步出監(jiān)牢的瞬間宅倒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工屯耸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留唉堪,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓肩民,卻偏偏與公主長得像,于是被迫代替她去往敵國和親链方。 傳聞我的和親對象是個殘疾皇子持痰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容