前言:
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)意钳降。