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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

IOS-UIDynamic

發布時間:2023/12/18 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IOS-UIDynamic 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

UIDynamic中的三個重要概念

Dynamic Animator:動畫者,為動力學元素提供物理學相關的能力及動畫,同時為這些元素提供相關的上下文,是動力學元素與底層iOS物理引擎之間的中介,將Behavior對象添加到Animator即可實現動力仿真 Dynamic Animator Item:動力學元素,是任何遵守了UIDynamicItem協議的對象,從iOS 7.0開始,UIView和UICollectionViewLayoutAttributes默認實現該協議。如果自定義的對象實現了該協議,即可通過Dynamic Animator實現物理仿真 UIDynamicBehavior:仿真行為,是動力學行為的父類,基本的動力學行為類UIGravityBehavior、UICollisionBehavior、UIAttachmentBehavior、UISnapBehavior、UIPushBehavior以及UIDynamicItemBehavior均繼承自該父類 動力學動畫元素(Dynamic Animator Item)協議 只有遵守了UIDynamicItem協議的對象才可以參與到UI動力學仿真中 從iOS 7開始,UIView和UICollectionViewLayoutAttributes 類默認實現了該協議 協議定義的屬性: bounds:Dynamic animator需要動畫元素的邊框時調用,只讀屬性,用于計算物體的邊界以及質量 center:動力學元素的中心點,讀寫屬性 transform:動力學元素的旋轉角度,讀寫屬性(需要指定Layer的形變屬性) 動力學行為(Dynamic Behavior) iOS7.0中提供的動力學行為包括: UIGravityBehavior:重力行為 UICollisionBehavior:碰撞行為 UIAttachmentBehavior:附著行為 UISnapBehavior:吸附行為 UIPushBehavior:推行為 UIDynamicItemBehavior:動力學元素行為 所有的UIDynamicBehavior都是可以獨立作用,同時也遵守力的合成。也就是說,組合使用行為可以實現一些較復雜的效果 重力行為(Gravity) 重力行為用于給動力學元素指定一個重力向量

// 實例化一個重力行為,并傳入需要做動力仿真的對象view

UIGravityBehavior *gravity = [[UIGravityBehavior alloc] initWithItems:@[view]];

// 將重力行為添加到animator

[animator addBehavior:gravity]; 碰撞行為(Collision) 碰撞行為用于指定一組動力學元素,在指定的邊界范圍內,可以彼此發生碰撞 碰撞行為提供了代理方法,可用于在物體碰撞前、后對動力學元素做碰撞后續的處理

// 實例化碰撞行為,并指定view參與碰撞

UICollisionBehavior *collsion = [[UICollisionBehavior alloc] initWithItems:@[view]];

// 指定是否啟用參照系的邊界

collsion.translatesReferenceBoundsIntoBoundary = YES;

// 將碰撞行為添加至animator

[animator addBehavior:collsion];

?

吸附行為(Snap)

吸附行為可以將視圖通過動畫吸附到某個點上 初始化設定一下UISnapBehavior的initWithItem:snapToPoint:即可 屬性: damping:振幅大小,默認為0.5f

/ 刪除之前的吸附行為

[_animator removeBehavior:_snap];

CGPoint location = [sender locationInView:self.view];

_snap = [[UISnapBehavior alloc] initWithItem:_boxImageView snapToPoint:location];

// 生成隨機振幅

CGFloat damping = arc4random_uniform(10) + 1;

_snap.damping = damping / 10.0f;

[_animator addBehavior:_snap];

附著行為(Attachment) 附著行為描述一個視圖與一個錨點或者另一個視圖相連接的情況 附著行為描述的是兩點之間的連接情況,可以模擬剛性或者彈性連接 在多個物體間設定多個UIAttachmentBehavior,可以模擬多物體連接 屬性: attachedBehaviorType:連接類型(連接到錨點或視圖) items:連接視圖數組 anchorPoint:連接錨點 length:距離連接錨點的距離 只要設置了以下兩個屬性,即為彈性連接 damping:振幅大小 frequency:振動頻率

if (UIGestureRecognizerStateBegan == sender.state) {

??? // 創建附加剛性行為

??? ??CGPoint anchorPoint = CGPointMake(_boxImageView.center.x, _boxImageView.center.y);

??? _attachment = [[UIAttachmentBehavior alloc] initWithItem:_boxImageView offsetFromCenter:UIOffsetMake(-25.0, -25.0) attachedToAnchor:anchorPoint];

??? [_animator addBehavior:_attachment];

} else if (UIGestureRecognizerStateChanged == sender.state) {

??? // 設置行為的錨點

??? [_attachment setAnchorPoint:[sender locationInView:self.view]];

} else if (UIGestureRecognizerStateEnded == sender.state) {

??? // 刪除附加行為

??? [_animator removeBehavior:_attachment];

}

?

//附加彈性行為

if (UIGestureRecognizerStateBegan == sender.state) {

??? CGPoint anchor = CGPointMake(_boxImageView.center.x, _boxImageView.center.y - 100);

??? _attachment = [[UIAttachmentBehavior alloc] initWithItem:_boxImageView attachedToAnchor:anchor];

??? [_animator addBehavior:_attachment];

??? [_attachment setFrequency:1.0f];

??? [_attachment setDamping:0.1f];

} else if (UIGestureRecognizerStateChanged == sender.state) {

??? [_attachment setAnchorPoint:[sender locationInView:self.view]];

} else if (UIGestureRecognizerStateEnded == sender.state) {

??? [_animator removeBehavior:_attachment];

}

推行為(Push) ?推行為可以為一個視圖施加一個作用力,該力可以是持續的,也可以是一次性的 ?可以設置力的大小,方向和作用點等信息 ? ?屬性: ?mode:推動類型(一次性或是持續推) ?active:是否激活,如果是一次性推,需要激活 ?angle:推動角度 ?magnitude:推動力量

// 計算兩點之間距離

CGFloat distance = sqrtf(powf(p.x - _firstPoint.x, 2.0) + powf(p.y - _firstPoint.y, 2.0));

CGFloat angle = atan2(p.y - _firstPoint.y, p.x - _firstPoint.x);

_push.magnitude = distance / 20;

_push.angle = angle;

[_push setActive:YES];

動力學元素行為(DynamicItem) ?是一個輔助的行為,用來設置運動學元素參與物理仿真過程中的參數,如:彈性系數、摩擦系數、密度、阻力、角阻力以及是否允許旋轉等 ? ?elasticity(彈性系數):決定了碰撞的彈性程度,比如碰撞時物體的彈性 ?friction(摩擦系數) :決定了沿接觸面滑動時的摩擦力大小 ?density(密度): 跟size結合使用,計算物體的總質量。質量越大,物體加速或減速就越困難 ?resistance(阻力):決定線性移動的阻力大小,與摩擦系數不同,摩擦系數只作用于滑動運動 ?angularResistance(角阻力) :決定旋轉運動時的阻力大小 ?allowsRotation(允許旋轉):這個屬性很有意思,它在真實的物理世界沒有對應的模型。設置這個屬性為 NO 物體就完全不會轉動,而無論施加多大的轉動力

轉載于:https://www.cnblogs.com/mcj-coding/p/3558540.html

總結

以上是生活随笔為你收集整理的IOS-UIDynamic的全部內容,希望文章能夠幫你解決所遇到的問題。

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