iOS7 UIKit Dynamics 的初步研究
生活随笔
收集整理的這篇文章主要介紹了
iOS7 UIKit Dynamics 的初步研究
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
這回開始學(xué)習(xí)iOS7新的UIKit Dynamics,我看有人翻譯成UIKit 力學(xué),我覺(jué)得倒挺貼切的,所以就借來(lái)用一用。
這個(gè)UIKit力學(xué)系統(tǒng)里要設(shè)計(jì)到四個(gè)東西: 1、UIDynamicAnimator:這個(gè)東西主要用于- 提供動(dòng)力xing為的上下文
- 根據(jù)ref view確定坐標(biāo)系
- 控制動(dòng)力引擎
- 維護(hù)著動(dòng)力行為的狀態(tài)
- UIAttachmentBehavior
- UICollisionBehavior
- UIDynamicItemBehavior
- UIGravityBehavior
- UIPushBehavior
- UISnapBehavior
?
然后寫一個(gè)小方法: 1 - (void)startAnimator 2 { 3 //新建一個(gè)view來(lái)做試驗(yàn)的物體。 4 UIView *testView = [[UIView alloc] initWithFrame:CGRectMake(110, 60, 100, 100)]; 5 [testView setBackgroundColor:[UIColor blueColor]]; 6 [self.view addSubview:testView]; 7 //初始化animator并且給它一個(gè)參考坐標(biāo)。 8 _animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view]; 9 _gravity = [[UIGravityBehavior alloc] initWithItems:@[testView]]; 10 [_animator addBehavior:_gravity]; 11 }?
再把這個(gè)方法在viewDidLoad方法里用一下,就OK了。 再運(yùn)行程序,就會(huì)看見有模擬器上面有個(gè)藍(lán)色的小球,然后他往下掉,接著就不見了= =。有點(diǎn)無(wú)聊。。。 現(xiàn)在無(wú)聊沒(méi)關(guān)系,后面我們?cè)偻纥c(diǎn)別的,現(xiàn)在先來(lái)研究一下這個(gè)暫時(shí)很無(wú)聊的程序代碼是怎么寫的,其實(shí)很簡(jiǎn)單,首先新建一個(gè)UIView實(shí)例名字叫testView,弄成一個(gè)藍(lán)色小球的樣子,然后初始化_animator再給他參考坐標(biāo),基本上UIKit力學(xué)里的所有動(dòng)作都要經(jīng)它手,然后初始化_gravity,給他testView。這個(gè)_gravity顧名思義,就是給testView一個(gè)類似受到地心引力的效果,會(huì)往下掉,而往下掉的加速度默認(rèn)是跟現(xiàn)實(shí)中的重力加速度一樣的。最后把_gravity這個(gè)行為加入到_animator,就完成了! ? 好,接下來(lái)我們研究點(diǎn)別的,雖然說(shuō)_gravity名字叫g(shù)ravity,但是我們能不能改一下加速度?可以的,下面我們來(lái)研究一下怎么改。 ? 翻看一下UIGravityBehavior文擋,發(fā)現(xiàn)一個(gè)名字叫magnitude的屬性,很明顯就是這個(gè)改變加速度了。在_gravity初始化的那行后面加上 ? 1 [_gravity setMagnitude:100];?
再運(yùn)行程序,就會(huì)發(fā)現(xiàn)那個(gè)藍(lán)色方塊一下就飛出去了,沒(méi)錯(cuò),就是它了。 另外UIGravityBehavior中還有幾個(gè)屬性- angle:控制物體飄向的角度
- graviteDirection:也是控制角度,只不過(guò)是用x,y的增量來(lái)表示
?
然后在startAnimator方法里初始化一下,就在最后寫就可以 1 _collision = [[UICollisionBehavior alloc] initWithItems:@[testView]]; 2 [_collision setTranslatesReferenceBoundsIntoBoundary:YES]; 3 [_animator addBehavior:_collision];?
然后就可以看到方塊掉到視圖底部的時(shí)候,彈了幾下,就停了。實(shí)現(xiàn)也很簡(jiǎn)單,初始化,給它testView,然后改TranslatesReferenceBoundsIntoBoundary 屬性為YES,最后將這個(gè)行為加到_animator里面就可以了。TranslatesReferenceBoundsIntoBoundary這個(gè)屬性也很直觀,就是告訴他把視圖當(dāng)邊界就是了。 除了把視圖邊緣當(dāng)碰撞的邊界,我們也可以自定義一個(gè)邊界。UICollisionBehavior也提供了這樣一個(gè)方法來(lái)定義邊界 ? ? –?addBoundaryWithIdentifier:fromPoint:toPoint: 用法如下: 1 [_collision addBoundaryWithIdentifier:@"barrier" fromPoint:CGPointMake(0, 360) toPoint:CGPointMake(240, 360)];?
也就是給他一個(gè)字符串說(shuō)一下名字,然后從這個(gè)點(diǎn)到那個(gè)點(diǎn),兩點(diǎn)之間即為自己定義的邊界。然而這條線是看不到樣子的,不過(guò)自己也可以畫一個(gè)上去。比如說(shuō)下面那樣。UICollisionBehavior還可以設(shè)置Delegate,讓方塊碰撞的時(shí)候發(fā)送回調(diào)一個(gè)方法,這時(shí)你就可以在碰撞的時(shí)候干點(diǎn)別的事情了。 比如這樣: 給ViewController.m里遵守一個(gè)協(xié)議<UICollisionBehaviorDelegate> ? 緊跟_collision設(shè)置自定義邊界的后面寫一行 1 [_collision setCollisionDelegate:self];
?
這樣就可以把Delegate設(shè)置為ViewController了 ? 然后重寫寫協(xié)議里的方法 1 - (void)collisionBehavior:(UICollisionBehavior *)behavior beganContactForItem:(id<UIDynamicItem>)item withBoundaryIdentifier:(id<NSCopying>)identifier atPoint:(CGPoint)p 2 { 3 UIView *v = (UIView *)item; 4 [v setBackgroundColor:[UIColor redColor]]; 5 [UIView animateWithDuration:0.3 animations:^{ 6 [v setBackgroundColor:[UIColor blueColor]]; 7 }]; 8 9 }?
上面這個(gè)方法里就實(shí)現(xiàn)了當(dāng)方塊發(fā)生碰撞的時(shí)候,就會(huì)閃一下紅色。 ? 除此之外在UICollisionBehaviorDelegate協(xié)議中還有幾種方法- –?collisionBehavior:beganContactForItem:withBoundaryIdentifier:atPoint:
- –?collisionBehavior:beganContactForItem:withItem:atPoint:
- –?collisionBehavior:endedContactForItem:withBoundaryIdentifier:
- –?collisionBehavior:endedContactForItem:withItem:
- UICollisionBehaviorModeItems
- UICollisionBehaviorModeEverything
- UICollisionBehaviorModeBoundaries
?
這個(gè)時(shí)候運(yùn)行程序,發(fā)現(xiàn)第一塊方塊還留在我們之前定義的邊界上,而第二塊方塊就掉出邊界消失了,這是因?yàn)槲覀儧](méi)有把第二塊方塊加進(jìn)_collision里面,不過(guò)這我們不管,這正好用來(lái)研究UIAttachmentBehavior。 在startAnimator方法最后加上這兩行代碼,初始化一下_attachment,并加入兩個(gè)方塊,這個(gè)初始化表示兩個(gè)方塊吸附在一起。 1 _attachment = [[UIAttachmentBehavior alloc] initWithItem:testView attachedToItem:testView2]; 2 3 [_animator addBehavior:_attachment];?
然后運(yùn)行程序,發(fā)現(xiàn)第一個(gè)方塊還是像以前那樣留在邊界上,但第二塊方塊就在邊界下面,兩個(gè)方塊好像中間有跟繩子連在一起那樣,這就是UIAttachmentBehavior的作用了。 同樣的,UIAttachmentBehavior也提供了好幾種屬性來(lái)做出各種效果,分別是:- anchorPoint:依附的點(diǎn)
- attachedBehaviorType:依附的類型
- damping:兩個(gè)物體之間的阻尼系數(shù),其實(shí)就是兩個(gè)物體被縮小距離的時(shí)候造成的影響程度
- frequency:震蕩頻率,加大的時(shí)候就發(fā)現(xiàn)下面那個(gè)方塊蕩來(lái)當(dāng)去= =
- length:吸附的長(zhǎng)度
這個(gè)行為提供了自轉(zhuǎn)和直線的運(yùn)動(dòng)行為。實(shí)現(xiàn)一個(gè)實(shí)例來(lái)說(shuō)明一下,首先把之前那些奇奇怪怪的Behavior都清除掉,只留下_collision來(lái)實(shí)現(xiàn)一個(gè)邊界就好。 聲明一個(gè)UIDynamicItemBehavior實(shí)例: 1 UIDynamicItemBehavior *_dynamicItem;
?
然后添加下面的代碼: 1 _dynamicItem = [[UIDynamicItemBehavior alloc] initWithItems:@[testView]]; 2 [_dynamicItem addAngularVelocity:5 forItem:testView]; 3 [_animator addBehavior:_dynamicItem];?
這個(gè)時(shí)候,方塊會(huì)自己按順時(shí)針?lè)较蜃赞D(zhuǎn),然后慢慢停下來(lái),也就是給他一個(gè)初速度自轉(zhuǎn),接著就在摩擦之類的作用下停下來(lái)了。 把上面第二行代碼去掉,換成如下代碼,就能實(shí)現(xiàn)另一個(gè)行為,直線運(yùn)動(dòng),而LinearVelocity就是同樣要給他一個(gè)x,y的初速度,然后它就會(huì)根據(jù)向量的疊加方向直線運(yùn)動(dòng)。 1 [_dynamicItem addLinearVelocity:CGPointMake(500, 100) forItem:testView];?
在這兩個(gè)行為的基礎(chǔ)下,還有幾個(gè)屬性來(lái)配合這兩個(gè)行為:- ? ?allowsRotation:是否允許旋轉(zhuǎn)
- ? ?angularResistance:設(shè)置旋轉(zhuǎn)時(shí)的阻力
- ? ?density:物體的密度
- ? ?elasticity:物體的彈性,直接影響物體撞到東西之后怎么彈
- ? ?friction:物體的摩擦力
- ? ?resistance:物體受到的阻力
還有一個(gè)PushBehavior,這個(gè)推也很好理解,我們直接來(lái)看代碼,把代碼中除了關(guān)于方塊,_animator,_collision的東西都刪掉,在最后添加如下代碼: 1 _push = [[UIPushBehavior alloc] initWithItems:@[testView] mode:UIPushBehaviorModeInstantaneous]; 2 [_push setAngle:1]; 3 [_push setMagnitude:0.2]; 4 [_animator addBehavior:_push];
?
再運(yùn)行程序,就可以看見方塊仿佛被推了一下,然后就動(dòng)了起來(lái),代碼實(shí)現(xiàn)也很簡(jiǎn)單,初始化_push,然后給他方塊,還有設(shè)置一個(gè)模式,這里模式分別有UIPushBehaviorModeInstantaneous以及mode:UIPushBehaviorModeContinuous,兩個(gè)的區(qū)別就是一個(gè)是推一下,一個(gè)是連續(xù)推。 初始化完之后,就給他設(shè)置角度和初速度就好了,簡(jiǎn)單粗暴。 UISnapBehavior 最后還有一個(gè)UISnapBehavior,其實(shí)這個(gè)更簡(jiǎn)單,按照慣例直接上代碼 1 _snap = [[UISnapBehavior alloc] initWithItem:testView snapToPoint:CGPointMake(400, 400)]; 2 [_animator addBehavior:_snap];?
運(yùn)行程序,就會(huì)發(fā)現(xiàn)方塊突然好像被釘在某處那樣,沒(méi)錯(cuò),這就是UISnapBehavior的效果。無(wú)需多解釋。 它也只有一個(gè)屬性damping,直接加上這一行: 1 [_snap setDamping:10];?
就會(huì)發(fā)現(xiàn)方塊移動(dòng)變慢了,這就是一個(gè)阻尼屬性。 研究下來(lái),其實(shí)實(shí)現(xiàn)也很簡(jiǎn)單的,這系列API真的幫助我們簡(jiǎn)單地實(shí)現(xiàn)這些挺好玩的效果,材料就在這里,炒成什么菜就看大家了!轉(zhuǎn)載于:https://www.cnblogs.com/adamleung/p/3497709.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的iOS7 UIKit Dynamics 的初步研究的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android事件处理--读书笔记
- 下一篇: android或java timer声明