今天給大家介紹一下我們iOS開發(fā)中不太常用的UIDynamic(當(dāng)然只是對于非游戲類開發(fā)人員說不常用了),我們研究它可以做一些有趣的效果,下面我們先來看一下關(guān)于UIDynamic.
一棵里、簡單介紹
1.什么是UIDynamic
UIDynamic是從iOS 7開始引入的一種新技術(shù),隸屬于UIKit框架
可以認(rèn)為是一種物理引擎,能模擬和仿真現(xiàn)實生活中的物理現(xiàn)象
如:重力带猴、彈性碰撞等現(xiàn)象
2.物理引擎的價值
廣泛用于游戲開發(fā)熊赖,經(jīng)典成功案例是“憤怒的小鳥”
讓開發(fā)人員可以在遠(yuǎn)離物理學(xué)公式的情況下朦蕴,實現(xiàn)炫酷的物理仿真效果
提高了游戲開發(fā)效率瓶摆,產(chǎn)生更多優(yōu)秀好玩的物理仿真游戲
3.知名的2D物理引擎
Box2d
Chipmunk
二凹蜂、使用步驟
要想使用UIDynamic來實現(xiàn)物理仿真效果馍驯,大致的步驟如下
- 創(chuàng)建一個物理仿真器(順便設(shè)置仿真范圍)
- 創(chuàng)建相應(yīng)的物理仿真行為(順便添加物理仿真元素)
- 將物理仿真行為添加到物理仿真器中 (開始仿真)
OK廢話不多說直接看一下能實現(xiàn)那些基本的效果
重力行為+碰撞檢測 (效果如下圖)
重力行為+碰撞檢測 (代碼實現(xiàn))
// 當(dāng)點擊屏幕時 灰色Lable自由落體, 與綠色和黃色Lable產(chǎn)生碰撞
#import "ViewController.h"
@interface ViewController ()
// 在storyboard中拖了3個UILable控件
@property (weak, nonatomic) IBOutlet UILabel *grayLable;
@property (weak, nonatomic) IBOutlet UILabel *yellowLable;
@property (weak, nonatomic) IBOutlet UILabel *greenLable;
// 物理仿真器
@property (strong, nonatomic) UIDynamicAnimator *animator ;
@end
@implementation ViewController
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//1.物理仿真器
self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
//2.1創(chuàng)建碰撞行為
// items 設(shè)置可以碰撞元素
UICollisionBehavior *collision = [[UICollisionBehavior alloc] initWithItems:@[self.grayLable, self.yellowLable, self.greenLable]];
// 以 參數(shù)的view 為邊界
collision.translatesReferenceBoundsIntoBoundary = YES;
// 2.2創(chuàng)建“重力”仿真行為
// items指定 可以仿真 “重力”行為元素
UIGravityBehavior *gravity = [[UIGravityBehavior alloc] initWithItems:@[self.grayLable]];
// 3.1把 重力行為 添加到 仿真器
[self.animator addBehavior:gravity];
// 3.2把碰撞行為 添加 到仿真器
[self.animator addBehavior:collision];
}
@end
捕捉行為
可以讓物體迅速沖到某個位置(捕捉位置)阁危,捕捉到位置之后會帶有一定的震動
效果圖如下
捕捉行為 (代碼實現(xiàn))
#import "ViewController.h"
@interface ViewController ()
// 在storyboard拖了一個UIImageView控件,并設(shè)置圖片
@property (weak, nonatomic) IBOutlet UIImageView *pictureView;
// 物理仿真器
@property (strong, nonatomic) UIDynamicAnimator *animatior ;
@end
@implementation ViewController
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
// 獲取觸摸點
UITouch *touch = [touches anyObject];
CGPoint point = [touch locationInView:touch.view];
//捕捉行為
//1.物理仿真器
self.animatior = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
// 2.創(chuàng)建捕捉行為
// 只要遵守UIDynamicItem協(xié)議的對象,我們稱這個對象為 “物理仿真元素”
UISnapBehavior *snapBehavior = [[UISnapBehavior alloc] initWithItem:self.pictureView snapToPoint:point];
// dampoint取值只能 0~1
// 振幅的幅度 值越小幅度越大汰瘫,值越大幅度越小
snapBehavior.damping = 0.3;
// 3.把捕捉行為 添加到 仿真器
[self.animatior addBehavior:snapBehavior];
}
UIDynamic提供了以下幾種物理仿真行為
UIGravityBehavior:重力行為
UICollisionBehavior:碰撞行為
UISnapBehavior:捕捉行為
UIPushBehavior:推動行為
UIAttachmentBehavior:附著行為
UIDynamicItemBehavior:動力元素行為