日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS7 UIKit Dynamics 的初步研究

發布時間:2025/3/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS7 UIKit Dynamics 的初步研究 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這回開始學習iOS7新的UIKit Dynamics,我看有人翻譯成UIKit 力學,我覺得倒挺貼切的,所以就借來用一用。

這個UIKit力學系統里要設計到四個東西: 1、UIDynamicAnimator:這個東西主要用于
  • 提供動力xing為的上下文
  • 根據ref view確定坐標系
  • 控制動力引擎
  • 維護著動力行為的狀態
2、UIDynamicBehavior:主要用來描述動力的行為,iOS7里默認提供了以下幾種行為
  • UIAttachmentBehavior
  • UICollisionBehavior
  • UIDynamicItemBehavior
  • UIGravityBehavior
  • UIPushBehavior
  • UISnapBehavior
3、Reference View:這個是用來初始化Animator的時候用的,作用是給動力行為提供參考坐標系 4、dynamic item:動力項就是遵循UIDynamicItem協議的任意對象。 說了那么多理論,我自己都搞不清楚了,直接上代碼吧。 首先來一個最簡單的demo,新建一個項目,選擇single VIew Application,然后在ViewController.m里聲明幾個變量。 1 UIDynamicAnimator *_animator; 2 UIGravityBehavior *_gravity;

?

然后寫一個小方法: 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的增量來表示
好了,知道這幾個屬性我們就可以控制物體怎么飄了。 ? 但是方塊一下子就飄出去了,該怎么讓他留在模擬器視圖里面呢?這就要用到UICollisionBehavior了。 顧名思義就是一個碰撞行為,讓他碰到視圖邊緣也算一個碰撞行為。 ? 再ViewController.m里也聲明一個UICollisionBehavior的實例名字叫_collision. ? 1 UICollisionBehavior * _collision;

?

然后在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:
分別可以在開始,結束,按物體來分事件還是按邊界來分事件等。 UICollisionBehavior里還可以設置碰撞模式,有一個名字叫CollisionMode的屬性就可以修改這個屬性,CollisionMode有三個枚舉可以選擇,分別是:
  • UICollisionBehaviorModeItems
  • UICollisionBehaviorModeEverything
  • UICollisionBehaviorModeBoundaries
其實也就是你可以選擇跟什么東西發生碰撞,比如選擇UICollisionBehaviorModeItems的時候,就表示你指向跟另外一個物體發生碰撞,而不跟邊界碰撞。 碰撞說得差不多了,我們來研究點別的。 比如UIAttachmentBehavior,按字面意思來理解應該是一種吸附行為,那我們再新建另一個方塊來試試這個Behavior。 1 UIView *testView2 = [[UIView alloc] initWithFrame:CGRectMake(110, 170, 100, 100)]; 2 [testView2 setBackgroundColor:[UIColor greenColor]]; 3 [self.view addSubview:testView2]; 把它放到第一個方塊的下面,顏色為綠色。 ? 然后在_gravity初始化的時候也把第二塊方塊加進里面,不然第二塊方塊就不會往下掉了。 ? 1 _gravity = [[UIGravityBehavior alloc] initWithItems:@[testView,testView2]];

?

這個時候運行程序,發現第一塊方塊還留在我們之前定義的邊界上,而第二塊方塊就掉出邊界消失了,這是因為我們沒有把第二塊方塊加進_collision里面,不過這我們不管,這正好用來研究UIAttachmentBehavior。 在startAnimator方法最后加上這兩行代碼,初始化一下_attachment,并加入兩個方塊,這個初始化表示兩個方塊吸附在一起。 1 _attachment = [[UIAttachmentBehavior alloc] initWithItem:testView attachedToItem:testView2]; 2 3 [_animator addBehavior:_attachment];

?

然后運行程序,發現第一個方塊還是像以前那樣留在邊界上,但第二塊方塊就在邊界下面,兩個方塊好像中間有跟繩子連在一起那樣,這就是UIAttachmentBehavior的作用了。 同樣的,UIAttachmentBehavior也提供了好幾種屬性來做出各種效果,分別是:
  • anchorPoint:依附的點
  • attachedBehaviorType:依附的類型
  • damping:兩個物體之間的阻尼系數,其實就是兩個物體被縮小距離的時候造成的影響程度
  • frequency:震蕩頻率,加大的時候就發現下面那個方塊蕩來當去= =
  • length:吸附的長度
UIDynamicItemBehavior
這個行為提供了自轉和直線的運動行為。實現一個實例來說明一下,首先把之前那些奇奇怪怪的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:物體受到的阻力
UIPushBehavior
還有一個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 的初步研究的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 精品在线视频免费观看 | 亚洲精品免费在线 | 免费在线国产精品 | 香蕉人人精品 | 婷婷影院在线观看 | 成年人免费看的视频 | a天堂中文网 | 午夜在线影院 | 日韩欧美综合视频 | 精品国产精品网麻豆系列 | 色一情一乱一伦一区二区三区 | 神马影院一区二区三区 | 国产精品老熟女一区二区 | www久久精品 | 爆操av| 色偷偷一区二区三区 | 欧美精品久久久久久久久老牛影院 | 亚洲一区二区三区黄色 | 午夜日韩福利 | 午夜影院福利社 | 午夜伦伦电影理论片费看 | 国产稀缺真实呦乱在线 | 欧美福利电影 | 极品尤物一区二区 | 麻豆成人免费视频 | 丝袜熟女一区二区 | 国产精品久久久久野外 | 欧美亚洲另类小说 | 色黄网站在线观看 | 91视频大全 | 黄色天堂网 | 国产精品无码一区二区三区三 | 久久视奸 | 黄色免费视屏 | av一区二区三区免费观看 | 欧美日韩色图片 | 中文字幕亚洲天堂 | 欧美日韩精品在线 | 久久avav | 国产美女视频网站 | 天堂网av在线 | 日韩在线播放中文字幕 | 国产在线视频自拍 | 成年人在线播放视频 | www.4hu95.com四虎 极品在线视频 | 国产黄色片免费 | 国产xxxx做受视频 | 榴莲视频黄色 | 黑人又大又粗又长 | 九色91视频 | 国产高清在线视频 | 特级毛片av| 久久成人a | 法国空姐电影在线 | 黄色免费一级 | 无码h肉动漫在线观看 | 九九九亚洲 | 免费成人深夜在线观看 | 意大利少妇愉情理伦片 | 欧美成人免费一级 | 国产成人精品久久久 | 亚洲天堂免费在线观看视频 | 日本特级淫片 | 成人片在线看 | 草草视频在线免费观看 | 青草一区 | 日韩久久精品视频 | 四虎一区二区 | 麻豆国产一区二区三区四区 | 国内毛片毛片毛片毛片毛片 | 成人欧美一区二区三区黑人动态图 | 日日爱网站| 国产一区二区三区播放 | 男生和女生差差视频 | 日韩福利视频一区 | 波多野结衣调教 | 欧美日韩在线免费视频 | 99久久精品一区二区 | 中文字幕天堂 | 国产一级精品视频 | 国产一区二区三区免费观看 | 三级在线网址 | 免费人成又黄又爽又色 | 亚洲91网 | 日韩久 | 久久香蕉网 | 日本大乳美女 | 在线观看亚洲天堂 | 色欲国产精品一区二区 | 日韩毛片在线看 | 精品一区二区三区久久久 | 日日干天天射 | 大奶一区二区 | 欧洲金发美女大战黑人 | 久久高清无码视频 | 毛片视频免费 | 国产三级做爰高清在线 | 久久精品中文字幕 | 裸体美女免费视频网站 |