UIKit Dynamics框架

前言:

UIKit Dynamics是iOS7.0新增的一組類和方法施符,可以賦予UIView逼真的行為和特征,從而改善用戶體驗(yàn)擂找。

要實(shí)現(xiàn)動(dòng)態(tài)行為戳吝,需要先創(chuàng)建一個(gè)UIDynamicAnimator(力學(xué)動(dòng)畫生成器)的實(shí)例對(duì)象。對(duì)于每個(gè)力學(xué)動(dòng)畫生成器都可以使用各種屬性和行為進(jìn)行定制贯涎,如重力听哭、碰撞檢測(cè)、密度、摩擦力等陆盘。

有6個(gè)用于定制UIDynamicAnimator的類:UIAttachmentBehavior普筹、UICollisionBehavior、UIDynamicItemBehavior隘马、UIGravityBehavior太防、UIPushBehavior和UISnapBehavior。

1.重力

UIDynamicAnimator *animation = [[ UIDynamicAnimator alloc ]initWithReferenceView: self.view]; // 創(chuàng)建力學(xué)動(dòng)畫生成器

UIGravityBehavior * gravityBehavior = [[[UIGravityBehavior alloc] initWithItems:@[frogImageView]] autorelease]祟霍;//創(chuàng)建重力行為對(duì)象杏头,其中frogImageView是需要實(shí)現(xiàn)動(dòng)畫的視圖,是self.view的子視圖

[gravityBehavior setXComponent:0.0 yComponent:0.1]沸呐;//設(shè)置方向和作用力(1.0為地球的重力加速度)

[animator addBehavior:gravityBehavior]醇王;//添加行為

注:動(dòng)態(tài)物體必須是參考視圖的子視圖,否則力學(xué)動(dòng)畫生成器不會(huì)生成任何動(dòng)態(tài)效果崭添!

在UIKit Dynamics中寓娩,重力的方向可以不向下,如果將參數(shù)yComponent設(shè)置為負(fù)數(shù)呼渣,重力方向就會(huì)向上棘伴;同樣可以改變xComponent。

2.碰撞

UICollisionBehavior是創(chuàng)建碰撞行為屁置,和重力行為創(chuàng)建方式一樣焊夸,使用受影響的視圖進(jìn)行初始化。除了受影響的視圖外蓝角,還需要設(shè)置碰撞對(duì)象:UICollisionBehaviorModeItems導(dǎo)致物體相互碰撞阱穗;UICollisionBehaviorModeBoundaries導(dǎo)致物體不相互碰撞,只與邊界發(fā)生碰撞使鹅;UICollisionBehaviorModeEverything導(dǎo)致物體既相互碰撞揪阶,又與邊界碰撞。

要是物體與邊界碰撞患朱,必須要自定義邊界鲁僚。邊界可以是NSBezierPath,也可以是兩點(diǎn)之間裁厅,分別用addBoundaryWithIdentifier:forPath和addBoundaryWithIdentifier:fromPoint:toPoint進(jìn)行設(shè)置冰沙;將UICollisionBehavior對(duì)象的translatesReferenceBoundsIntoBoundary設(shè)置為YES就是默認(rèn)手機(jī)屏幕為邊界。

UIDynamicAnimator *animation = [[ UIDynamicAnimator alloc ]initWithReferenceView: self.view]; // 創(chuàng)建力學(xué)動(dòng)畫生成器

UIGravityBehavior * gravityBehavior = [[[UIGravityBehavior alloc] initWithItems:@[frogImageView]] autorelease]执虹;//創(chuàng)建重力行為對(duì)象

[gravityBehavior setXComponent:0.0 yComponent:0.1]倦淀;

UICollisionBehavior *collisionBehavior = [[[UICollisionBehavior alloc] initWithItems:@[frogImageView] ]autorelease];//創(chuàng)建碰撞行為對(duì)象

collisionBehavior.translateReferenceBoundsIntoBoundary = YES;//設(shè)置邊界

[collisionBehavior setCollisionMode:UICollisionBehaviorModeBoundaries]; //設(shè)置碰撞對(duì)象

[animator addBehavior:gravityBehavior];//添加行為

[animator addBehavior:collisionBehavior]声畏;//添加行為

UICollisionBehavior對(duì)象還可以設(shè)置代理撞叽。有4個(gè)代理方法姻成,其中兩個(gè)是碰撞開始時(shí)調(diào)用,兩個(gè)是碰撞結(jié)束時(shí)調(diào)用愿棋。所有方法都指向碰撞對(duì)象科展,碰撞開始的方法中還指出了接觸點(diǎn),一個(gè)CGPoint糠雨。

3.連接

UIAttachmentBehaviors可以指定兩個(gè)物體之間動(dòng)態(tài)連接才睹,讓一個(gè)物體的行為和移動(dòng)受制于另一個(gè)。默認(rèn)情況下甘邀,UIAttachmentBehaviors是將兩個(gè)物體的中心點(diǎn)作為連接點(diǎn)琅攘,但是可以修改為任何一點(diǎn)。

UIDynamicAnimator *animation = [[ UIDynamicAnimator alloc ]initWithReferenceView: self.view]; // 創(chuàng)建力學(xué)動(dòng)畫生成器

UICollisionBehavior *collisionBehavior = [[[UICollisionBehavior alloc] initWithItems:@[frogImageView松邪,secondImageView ] ]autorelease];//創(chuàng)建碰撞行為對(duì)象

collisionBehavior.translateReferenceBoundsIntoBoundary = YES;//設(shè)置邊界

[collisionBehavior setCollisionMode:UICollisionBehaviorModeBoundaries]; //設(shè)置碰撞對(duì)象

CGPoint frogImageViewCenter = frogImageView.center;//獲取中心點(diǎn)

self.attachmentBehavior = [[[UIAttachmentBehavior alloc] initWithItem:secondImageView attachedToAnchor:frogImageViewCenter] autorelease]坞琴;

[animator addBehavior:collisionBehavior];

[animator addBehavior:self.attachmentBehavior];

這樣兩個(gè)視圖就連接在了一起逗抑,連接物的長度是兩個(gè)視圖的初始距離剧辐。但此時(shí)frogImageView還不會(huì)移動(dòng),所以可以添加一個(gè)簡單的手勢(shì)邮府。在frogImageView移動(dòng)時(shí)更新中心點(diǎn)并且重新設(shè)置錨點(diǎn):

- (viod)handleAttachmentGesture:(UIPanGestureRecognizer *)gesture {

CGPoint gesturePoint = [gesture locationInView:self.view];

frogImageView.center = gesturePoint;

[self.attachmentBehavior setAnchorPoint:gesture];

}

UIAttachmentBehavior還可以修改其他屬性荧关,如振動(dòng)頻率和阻尼。

[self.attachmentBehavior setFrequency:1.0]褂傀;//設(shè)置振動(dòng)頻率

[self.attachmentBehavior setDamping:0.1f]; //設(shè)置震動(dòng)峰值

[self.attachmentBehavior setLength:100.0f]忍啤; //設(shè)置運(yùn)動(dòng)后的距離

4.吸附

UISnapBehavior只能關(guān)聯(lián)一個(gè)視圖,初始化時(shí)必須指定運(yùn)動(dòng)的終點(diǎn)仙辟。這種行為是由請(qǐng)按手勢(shì)觸發(fā)的同波。

CGPoint point = [gesture locationInView:self.view];

UIDynamicAnimator *animation = [[ UIDynamicAnimator alloc ]initWithReferenceView: self.view]; // 創(chuàng)建力學(xué)動(dòng)畫生成器

UISnapBehavior *snapBehavior = [[[UISnapBehavior alloc] initWithItem:frogImageView snapToPoint:point] autorelease];

snapBehavior .damping = 0.75欺嗤;//設(shè)置物體吸附時(shí)的彈跳力度

[animator addBehavior : snapBehavior];

5.推力

UIPushBehavior的使用比其他行為稍復(fù)雜。主要屬性有力度(magnitude)和角度(angle)卫枝。

UIPushBehavior *pushBehavior = [[[UIPushBehavior alloc] initWithItems:@[frogImageView] mode: UIPushBehaviorModeInstantaneous] autorelease]煎饼;//mode屬性有兩種,一種是瞬時(shí)里校赤,一種是持續(xù)力

以屏幕中心為參考點(diǎn)吆玖,添加手勢(shì)作為施加的力,里中心點(diǎn)越遠(yuǎn)马篮,作用力越大沾乘。

計(jì)算距離和角度,使用self.pushBehavior setMagnitude:和self.PushBehavior setAngle:設(shè)置浑测。最后[self.pushBehavior setActive:TRUE];

6.物體屬性

UIDynamicItemBehavior可以用來修改物體的屬性翅阵。初始化方法和其他行為大同小異歪玲,主要是設(shè)置UIDynamicItemBehavior對(duì)象的屬性。?

allowsRotation:一個(gè)Boolean值掷匠,指定物體在受力時(shí)是否會(huì)旋轉(zhuǎn)滥崩,默認(rèn)為YES。

angularResistance:一個(gè)CGFloat值讹语,取值范圍為0.0~CGFLOAT_MAX钙皮;指定旋轉(zhuǎn)阻力,其值越大顽决,旋轉(zhuǎn)速度下降越快短条。

density:物體密度。默認(rèn)情況下100X100點(diǎn)的物體質(zhì)量為1.0,100X200的物體質(zhì)量為2.0才菠。調(diào)整密度會(huì)影響重力和碰撞效果茸时。

elasticity:取值范圍為0.0~1.0,表示與其他物體碰撞時(shí)的彈性鸠儿。0.0表示沒有彈性屹蚊,1.0表示反彈作用力和碰撞作用力相等。

friction:物體之間的滑動(dòng)阻力进每。0.0表示沒有阻力汹粤,1.0表示阻力很大,但可將該值設(shè)置大于1的某個(gè)值繼續(xù)增加阻力田晚。

resistance:空氣阻力嘱兼,取值范圍為0.0~CGFLOAT_MAX。0.0表示沒有空氣阻力贤徒,1.0表示一旦其他力消失物體就會(huì)停下來芹壕。

7.其他屬性和代理方法

UIDynamicAnimator都是使用addBehavior:添加行為,也可以使用removeBehavior:和removeAllBehavior刪除行為接奈,還可以通過behavior屬性查看關(guān)聯(lián)的行為踢涌,將會(huì)返回一個(gè)數(shù)組。還可以查詢動(dòng)畫生成器是否在運(yùn)行(running屬性)序宦,更可以使用elapsedTime屬性查詢運(yùn)行時(shí)長睁壁。UIDynamicAnimator還有一個(gè)代理(UIDynamicAnimatorDelegate),他包含兩個(gè)代理方法互捌,分別是處理暫停和繼續(xù)的方法潘明。開發(fā)人員不能主動(dòng)暫停UIDynamicAnimator。

-(viod)dynamicAnimatorDidPause:(UIDynamicAnimator *)animator {

? ? ? ? NSLog(@"Animator did pause");

}

-(viod)dynamicAnimatorWillResume:(UIDynamicAnimator *)animator {

NSLog(@"Animator will resume");

}

總結(jié):以上是UIKit Dynamics的基本知識(shí)和組成部分秕噪,主要還是依賴于開發(fā)人員的創(chuàng)意钳降。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市腌巾,隨后出現(xiàn)的幾起案子遂填,更是在濱河造成了極大的恐慌铲觉,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件城菊,死亡現(xiàn)場(chǎng)離奇詭異备燃,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)凌唬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門并齐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人客税,你說我怎么就攤上這事况褪。” “怎么了更耻?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵测垛,是天一觀的道長。 經(jīng)常有香客問我秧均,道長食侮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任目胡,我火速辦了婚禮锯七,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘誉己。我一直安慰自己眉尸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布巨双。 她就那樣靜靜地躺著噪猾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪筑累。 梳的紋絲不亂的頭發(fā)上袱蜡,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音慢宗,去河邊找鬼坪蚁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛婆廊,可吹牛的內(nèi)容都是我干的迅细。 我是一名探鬼主播巫橄,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼淘邻,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了湘换?” 一聲冷哼從身側(cè)響起宾舅,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤统阿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后筹我,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扶平,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年蔬蕊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了结澄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡岸夯,死狀恐怖麻献,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情猜扮,我是刑警寧澤勉吻,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站旅赢,受9級(jí)特大地震影響齿桃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜煮盼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一短纵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧孕似,春花似錦踩娘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至泛烙,卻和暖如春理卑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蔽氨。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工藐唠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鹉究。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓宇立,卻偏偏與公主長得像,于是被迫代替她去往敵國和親自赔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子妈嘹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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