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