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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 本地Android源代码库下载源码
- 下一篇: 2014年2月份第3周51Aspx源码发