亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

iOS動畫——DynamicAnimate

2019-11-14 18:29:53
字體:
來源:轉載
供稿:網友

力學動畫

以dynamicAnimate為首的力學動畫是蘋果在iOS7加入的API,里面包含了很多力學行為,這套API是基于Box2d實現的。其中包含了重力、碰撞、推、甩、和自定義行為。

涉及到的類如下

涉及類描述
UIDynamicAnimator相當于一個manager,用于管理所有添加的力學行為
UIDynamicBehavior所有力學行為的父類,是一個抽象類
UIGravityBehavior重力
UICollisionBehavior碰撞,彈力
UIAttachmentBehavior吸附力
UipushBehavior推力
UISnapBehavior甩行力
UIDynamicItemBehavior自定義行為

 

 

 

 

 

 

 

 

 

UIDynamicAnimator需要是一個實例變量,如果是局部變量動畫會不起作用,個人感覺像是動作沒有添加到RunLoop在函數執行結束后被釋放了。

UIDynamicAnimator的初始化需要綁定一個視圖,而且與視圖必須是一對一的關系。

每一個行為都可以作用在很多的item上面,只要這個對象實現了<UIDynamicItem>協議,UIView默認就是所以不需要我們手動實現。

下面我們看幾個例子來逐個解釋

 

重力

重力很簡單,我們先看一個demo

- (void)viewDidLoad {    [super viewDidLoad];        view = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];    view.backgroundColor = [UIColor grayColor];    [self.view addSubview:view];        _animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];    UIGravityBehavior *gravity = [[UIGravityBehavior alloc] initWithItems:@[view]];    [gravity setAngle:3.14/2 magnitude:0.5];        [_animator addBehavior:gravity];
}

 

其中_animator是一個實例變量,上面解釋過了。運行后會發現view像是在重力作用下向下做勻加速直線運動。

上面代碼我們讓重力作于在view上面,同時設置了重力的方向和大小。

@PRoperty (readwrite, nonatomic) CGVector gravityDirection;@property (readwrite, nonatomic) CGFloat angle;@property (readwrite, nonatomic) CGFloat magnitude;- (void)setAngle:(CGFloat)angle magnitude:(CGFloat)magnitude;

 

上面是重力的方法和屬性,我們逐個看一下。

gravityDirection是重力向量,既然是向量就有方向和大小。使用的坐標系為UIKit坐標系,所以默認左上角為(0,0)點,而向量的大小就是重力的大小。

angle為向量的方向,我們可以不通過gravityDirection來設定重力方向而用angle設置方向,因為angle更加的直觀不用計算。

同理用magnitude來設置重力的大小。

 

彈力

彈力是一個很有意思的行為,除了我們設置彈力的item外,還要設置彈力的邊界。

我們先看例子

UICollisionBehavior *collisionBehavior = [[UICollisionBehavior alloc] initWithItems:@[view]];[collisionBehavior addBoundaryWithIdentifier:@"123ß" fromPoint:CGPointMake(0, 300) toPoint:CGPointMake(300, 600)];collisionBehavior.translatesReferenceBoundsIntoBoundary = YES;
[_animator addBehavior:collisionBehavior];

 

彈力中有一個屬性

@property (nonatomic, readwrite) BOOL translatesReferenceBoundsIntoBoundary;

 

是否把關聯視圖設置為邊界,這里的關聯視圖指的就是UIDynamicAnimator中的視圖。把該屬性設置為YES,運行代碼,大家會發view掉落到底部時會與底部放生彈性碰撞。

其實彈力行為提供了很多關于邊界的方法

- (void)setTranslatesReferenceBoundsIntoBoundaryWithInsets:(UIEdgeInsets)insets;- (void)addBoundaryWithIdentifier:(id <NSCopying>)identifier forPath:(UIBezierPath*)bezierPath;- (void)addBoundaryWithIdentifier:(id <NSCopying>)identifier fromPoint:(CGPoint)p1 toPoint:(CGPoint)p2;- (UIBezierPath*)boundaryWithIdentifier:(id <NSCopying>)identifier;- (void)removeBoundaryWithIdentifier:(id <NSCopying>)identifier;

 

這些都比較簡單就不一一解釋了,感興趣大家可以自己試一下。

下面著重介紹一個屬性

@property (nonatomic, assign, readwrite) id <UICollisionBehaviorDelegate> collisionDelegate;

 

彈力有一個代理,是不是覺得很有意思,我們繼續看例子

- (void)collisionBehavior:(UICollisionBehavior*)behavior beganContactForItem:(id <UIDynamicItem>)item1 withItem:(id <UIDynamicItem>)item2 atPoint:(CGPoint)p{    NSLog(@"began contact item");}- (void)collisionBehavior:(UICollisionBehavior*)behavior endedContactForItem:(id <UIDynamicItem>)item1 withItem:(id <UIDynamicItem>)item2{    NSLog(@"end contanct item");}- (void)collisionBehavior:(UICollisionBehavior*)behavior beganContactForItem:(id <UIDynamicItem>)item withBoundaryIdentifier:(id <NSCopying>)identifier atPoint:(CGPoint)p{    NSLog(@"began contact boundary");}- (void)collisionBehavior:(UICollisionBehavior*)behavior endedContactForItem:(id <UIDynamicItem>)item withBoundaryIdentifier:(id <NSCopying>)identifier{    NSLog(@"end contact boundary");}

 

我們實現彈力的代理并實現方法,運行程序,當初碰到底部的時候我們發現系統打印出了

2015-08-19 15:31:49.123 TransAnimate[25564:17037174] began contact boundary2015-08-19 15:31:49.157 TransAnimate[25564:17037174] end contact boundary2015-08-19 15:31:49.524 TransAnimate[25564:17037174] began contact boundary2015-08-19 15:31:49.557 TransAnimate[25564:17037174] end contact boundary

 

每次發生彈力將要作用和結束作用都會分別調用代理方法。

根據方法名就可以明白,這兩組代理方法一組針對物體碰撞,一組針對邊界碰撞。

 

吸附力

關于吸附力,首先要解釋一下,大家可以把吸附力理解為在吸附原點有一根棍,注意是棍不是繩子,連接著item。也就是說吸附力是剛性的。

下面看demo

    UIAttachmentBehavior *attachment = [[UIAttachmentBehavior alloc] initWithItem:view attachedToAnchor:CGPointMake(100, 200)];    attachment.length = 100;    [_animator addBehavior:attachment];

 

可以看到這里我們用的吸附力的構造方法是一個點,length就代表"棍"的長度,運行程序發現物體在重力的作用下會以Anchor為中心,以length為半徑,稍微轉一下。

吸附力提供了很多的構造方法

- (instancetype)initWithItem:(id <UIDynamicItem>)item attachedToAnchor:(CGPoint)point;- (instancetype)initWithItem:(id <UIDynamicItem>)item offsetFromCenter:(UIOffset)offset attachedToAnchor:(CGPoint)point;- (instancetype)initWithItem:(id <UIDynamicItem>)item1 attachedToItem:(id <UIDynamicItem>)item2;- (instancetype)initWithItem:(id <UIDynamicItem>)item1 offsetFromCenter:(UIOffset)offset1 attachedToItem:(id <UIDynamicItem>)item2 offsetFromCenter:(UIOffset)offset2;

 

這兩組構造方法的區別在于吸附對象,第一組是以點為對象,第二組以item為對象。

再解釋一下offset,這里指的是被吸附對象的錨點偏移量,默認是center。

下面看一下屬性

@property (readonly, nonatomic) UIAttachmentBehaviorType attachedBehaviorType;@property (readwrite, nonatomic) CGPoint anchorPoint;@property (readwrite, nonatomic) CGFloat length;@property (readwrite, nonatomic) CGFloat damping; @property (readwrite, nonatomic) CGFloat frequency; 

 

UIAttachmentBehaviorType屬性表明是吸附點是對象還是錨點。

下面幾個分別是錨點,吸附長度,阻力和振動頻率,就不說了。

 

推力
和重力差不多這里就不舉例子了看一下屬性和方法

- (void)setTargetOffsetFromCenter:(UIOffset)o forItem:(id <UIDynamicItem>)item;@property (nonatomic, readonly) UIPushBehaviorMode mode;@property (nonatomic, readwrite) BOOL active;@property (readwrite, nonatomic) CGFloat angle;@property (readwrite, nonatomic) CGFloat magnitude;@property (readwrite, nonatomic) CGVector pushDirection;- (void)setAngle:(CGFloat)angle magnitude:(CGFloat)magnitude;

 

下面的angle、magnitude、pushDirection和重力一模一樣不多說了。

重點說一下UIPushBehaviorMode和active

UIPushBehaviorMode表示該推力是持續作用還是短暫作用,active表示推力是否還在作用。

上面的- (void)setTargetOffsetFromCenter:(UIOffset)o forItem:(id <UIDynamicItem>)item;方法是說推力作用點的偏移量,默認是center。

 

甩行力

甩行力我也解釋不是很清楚,我覺的可以理解為一個黑洞在吸附物體吧,這樣應該挺形象的...

直接看例子吧

我們用故事板對控制器添加一個tapGesture的事件

- (IBAction)handleGesture:(UIGestureRecognizer *)sender {    CGPoint point = [sender locationInView:self.view];    UISnapBehavior *snap = [[UISnapBehavior alloc] initWithItem:view snapToPoint:point];    [_animator addBehavior:snap];}

 

運行程序發現我們點擊的位置,view會直接飛過去并且中間會有阻力。

甩行力只有一個屬性,就是阻力。

 

自定義行為

一般我們都是用不上自定義行為的,只有在少數時候需要自己定制

我們可以定制的屬性有很多

屬性描述
desnsity密度,如果一個100*100點的物體,它的密度為1.0,作用力是1.0那么它的加速度就是100點/S2
elasticity彈力洗漱,取值范圍0.0~1.0,0.0代表沒有彈力,1.0代表返券彈性碰撞
friction摩擦系數,0.0表示沒有摩擦力,1.0表示摩擦力很強,如果要設置更強的可以大于1
resistance阻力,物體運動的時候,在線性方向的阻力,0.0沒有阻力,CGFLOAT_MAX表示最大阻力
allowRotation是否允許旋轉。
angularResistance角阻力,物體旋轉時候,旋轉方向的阻力

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色综合久综合久久综合久鬼88| 久久精品久久久久久| 精品一区二区三区电影| 国产精品极品美女在线观看免费| 色婷婷亚洲mv天堂mv在影片| 91av在线免费观看| 这里只有精品久久| 日日摸夜夜添一区| 伊人av综合网| 日韩中文字幕视频在线| 日韩视频在线免费观看| 98精品国产高清在线xxxx天堂| 国内精品一区二区三区四区| 国产噜噜噜噜噜久久久久久久久| 亚洲人在线视频| 亚洲色图激情小说| 日韩av男人的天堂| 国产拍精品一二三| 国产成人精品免费久久久久| 4438全国成人免费| 亚洲第一天堂无码专区| 美日韩精品免费视频| 亚洲国产成人精品一区二区| 日韩黄色av网站| 久久香蕉国产线看观看网| 国产精品99一区| 国产视频久久网| 亚洲精品在线91| 欧美性jizz18性欧美| 在线观看视频99| 亚洲黄色有码视频| 日韩av免费在线播放| 亚洲另类xxxx| 亚洲天堂成人在线| 久久精品2019中文字幕| 国产精品一二三视频| 中文字幕一区日韩电影| 久久久精品视频在线观看| 国产日韩欧美在线| 日本中文字幕不卡免费| 欧美视频免费在线| 欧美黑人性生活视频| 欧美亚洲视频在线看网址| 国产亚洲精品久久久久动| 神马国产精品影院av| 97精品国产91久久久久久| 福利微拍一区二区| 欧美日韩美女在线观看| 在线看日韩av| 最好看的2019的中文字幕视频| 欧美自拍视频在线观看| 成人福利在线观看| 亚洲人成网站999久久久综合| 欧美成人黄色小视频| 欧美成人午夜视频| 中文字幕日韩免费视频| 久久精品精品电影网| 国产一区二区三区在线看| 欧美成人精品一区| 精品成人乱色一区二区| 久久久亚洲福利精品午夜| 亚洲精品国产免费| 国产成人福利网站| 九九精品视频在线| 欧美成人精品h版在线观看| 欧美激情在线狂野欧美精品| 国产91精品久久久久| 成人黄色短视频在线观看| 亚洲精品乱码久久久久久按摩观| 最近中文字幕2019免费| 视频一区视频二区国产精品| 国产欧美欧洲在线观看| 成人免费高清完整版在线观看| 中文字幕日韩在线视频| 欧美午夜影院在线视频| 欧美精品制服第一页| 97精品国产97久久久久久免费| 亚洲成人xxx| 疯狂蹂躏欧美一区二区精品| 啪一啪鲁一鲁2019在线视频| 北条麻妃久久精品| 国产精品久久久久秋霞鲁丝| 欧美精品在线极品| 久久精品国产欧美激情| 国产精品99久久久久久久久久久久| 久久精品成人动漫| 国产精品揄拍500视频| 国a精品视频大全| 精品人伦一区二区三区蜜桃免费| 午夜精品美女自拍福到在线| 亚洲无亚洲人成网站77777| 国模精品一区二区三区色天香| 亚洲一区二区三区四区视频| 久久久亚洲天堂| 日韩电影大全免费观看2023年上| 欧美激情xxxx性bbbb| 国产精品入口日韩视频大尺度| 国产自产女人91一区在线观看| 77777少妇光屁股久久一区| 国产精品成人在线| 最新亚洲国产精品| 97涩涩爰在线观看亚洲| 国产精品电影一区| 欧美日韩免费在线| 97碰碰碰免费色视频| 亚洲第一网中文字幕| 国产精品自拍偷拍| 俺去了亚洲欧美日韩| 国产精品久久久久9999| 亚洲第一天堂无码专区| 日韩经典中文字幕在线观看| 日韩视频免费看| 国产啪精品视频| 欧美极品少妇xxxxⅹ喷水| 日韩一区在线视频| 国产精品成人观看视频国产奇米| 欧美激情亚洲激情| 国产精品伦子伦免费视频| 91精品视频网站| 国产亚洲精品久久久久动| 国产精品视频不卡| 2024亚洲男人天堂| 亚洲视频视频在线| 国产成人拍精品视频午夜网站| 日日骚久久av| 国产精品综合久久久| 国产在线视频2019最新视频| 91精品久久久久久久久久| 欧美在线观看www| 91黑丝高跟在线| 国外成人在线视频| 亚洲欧美国产一区二区三区| 国产精品一区二区三区免费视频| 欧美一区二区三区艳史| 97超碰蝌蚪网人人做人人爽| 久久视频在线视频| 日日骚久久av| 38少妇精品导航| 懂色av一区二区三区| 欧美日韩国产在线播放| 久久国产加勒比精品无码| 国产一区二区三区三区在线观看| 精品久久久久久中文字幕大豆网| 亚洲精品自拍视频| 久久这里只有精品视频首页| 97免费视频在线| 日韩精品在线视频观看| 欧美在线欧美在线| 日韩一二三在线视频播| 国产亚洲欧美一区| 黑丝美女久久久| 欧美超级乱淫片喷水| 亚洲一区二区三区在线免费观看| 欧美精品免费播放| 91九色单男在线观看| 中文在线资源观看视频网站免费不卡| 国产精品久久一区主播| 成人免费福利视频| 国产精品99久久99久久久二8| 欧美性视频在线| 亚洲精品欧美一区二区三区| 亚洲第一二三四五区| 国产91精品久久久久久| 久久久噜噜噜久噜久久|