iOS UIKit動力學(一)基本介紹

文章已遷移到:limingjie.net传藏,請移步到http://limingjie.net/2016/11/07/iOS%20UIKit%E7%89%A9%E7%90%86%E5%BC%95%E6%93%8E%EF%BC%88%E4%B8%80%EF%BC%89%E4%BB%8B%E7%BB%8D/
關注文章最新更新

前言

iOS7開始UIKit框架中添加了力學引擎煤率,我們可以使視圖通過力學引擎驅(qū)動而具有真實的物理運動效果篱瞎。

如果你想做一個類似摩拜單車app中貼紙的小球碰撞效果,我相信這一系列文章肯定會對你有很大幫助的桦沉。

框架結構

  • UIDynamicAnimator
    UIDynamicAnimator是為動態(tài)元素提供力學相關功能和動畫,并為這些運動提供物理空間啥容。它是力學引擎和動態(tài)元素之間的媒介曲秉,這些元素通過物理行為(UIDynamicBehavior)被添加到UIDynamicAnimator中。
  • UIDynamicBehavior
    UIDynamicBehavior是給一個或多個動態(tài)元素參與的二維動畫賦予的行為熊赖。我們通常使用它的6個物理特征子類:
    UIGravityBehavior(重力)
    UICollisionBehavior(碰撞)
    UIAttachmentBehavior(吸附)
    UIPushBehavior(推動)
    UISnapBehavior(捕獲)
    UIDynamicItemBehavior
  • UIDynamicItem
    UIDynamicItem是參與力學運動的基本元素来屠,并且是遵守了UIDynamicItem協(xié)議的對象,例如UIViewUICollectionViewLayoutAttributes。如果自定義對象也實現(xiàn)了UIDynamicItem協(xié)議俱笛,也是可以使用的捆姜。

UIDynamicAnimator

詳細的介紹一下UIDynamicAnimator

  • 構造方法
-(instancetype)initWithReferenceView:(UIView *)view NS_DESIGNATED_INITIALIZER;

根據(jù)NS_DESIGNATED_INITIALIZER宏可以知道該方法是UIDynamicAnimator指定的初始化方法。
構建代碼如下:

@interface ViewController ()
@property (nonatomic,strong) UIDynamicAnimator * animator;
@end
_animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];

函數(shù)中的Reference View參數(shù)是指_animator所要實施力學動作的‘引用視圖’嫂粟,通俗的說就是運動元素所在的空間系娇未,_animator上所有的力學行為的動態(tài)元素都將以該‘引用視圖’作為空間系進行物理運動。這里我們把viewController中的self.view設置為‘引用視圖’星虹。

注意:在我們構建UIDynamicAnimator對象時一定要被其它對象有效持有零抬,不然在arc模式下將很快被自動釋放。

  • 屬性
// 引用視圖 (只讀)
@property (nullable, nonatomic, readonly) UIView *referenceView;
// 添加的行為數(shù)組 (只讀)
@property (nonatomic, readonly, copy) NSArray<__kindof UIDynamicBehavior*> *behaviors;
// 是否正在運行 (只讀)
@property (nonatomic, readonly, getter = isRunning) BOOL running;
// 運行以來的時間間隔(只讀宽涌,注意編譯條件)
#if UIKIT_DEFINE_AS_PROPERTIES
@property (nonatomic, readonly) NSTimeInterval elapsedTime;
#else
-(NSTimeInterval)elapsedTime;
#endif
// 代理
@property (nullable, nonatomic, weak) id <UIDynamicAnimatorDelegate> delegate;
  • 方法
// 添加行為
-(void)addBehavior:(UIDynamicBehavior *)behavior;
// 移除行為
-(void)removeBehavior:(UIDynamicBehavior *)behavior;
// 移除所有行為
-(void)removeAllBehaviors;
// 返回指定矩形區(qū)域中的動態(tài)項目
-(NSArray<id<UIDynamicItem>> *)itemsInRect:(CGRect)rect;
// 在UIDynamicAnimator中更新我們已經(jīng)修改的動態(tài)項目
-(void)updateItemUsingCurrentState:(id <UIDynamicItem>)item;
  • 代理(UIDynamicAnimatorDelegate)
@optional
// 當dynamicAnimator將要恢復調(diào)用
-(void)dynamicAnimatorWillResume:(UIDynamicAnimator *)animator;
// 當dynamicAnimator已經(jīng)暫停調(diào)用
-(void)dynamicAnimatorDidPause:(UIDynamicAnimator *)animator;

UIDynamicBehavior

在通常情況下我們不會直接使用UIDynamicBehavior類平夜,而是使用它的子類們。在開始介紹它的子類前卸亮,先來看看UIDynamicBehavior作為父類的一些屬性和方法:

// 添加一個自定義行為子類
- (void)addChildBehavior:(UIDynamicBehavior *)behavior;
// 移除一個自定義行為子類
- (void)removeChildBehavior:(UIDynamicBehavior *)behavior;
// 當一個動態(tài)行為被添加或移除忽妒,會回調(diào)該函數(shù)
- (void)willMoveToAnimator:(nullable UIDynamicAnimator *)dynamicAnimator;
// 子行為 (只讀)
@property (nonatomic, readonly, copy) NSArray<__kindof UIDynamicBehavior *> *childBehaviors;
// 在運行時調(diào)用的每一個動畫步驟的block形式動作代碼
@property (nullable, nonatomic,copy) void (^action)(void);
// 所屬的dynamicAnimator
@property (nullable, nonatomic, readonly) UIDynamicAnimator *dynamicAnimator;

UIDynamicItem

詳細介紹一下UIDynamicItem協(xié)議的屬性:

// 中心
@property (nonatomic, readwrite) CGPoint center;
// 實時范圍
@property (nonatomic, readonly) CGRect bounds;
// 旋轉(zhuǎn)狀態(tài)
@property (nonatomic, readwrite) CGAffineTransform transform;
@optional
/**
元素碰撞邊界的形狀類型
該參數(shù)用來獲得元素以何種形式進行碰撞
默認為UIDynamicItemCollisionBoundsTypeRectangle
 */
@property (nonatomic, readonly) UIDynamicItemCollisionBoundsType collisionBoundsType NS_AVAILABLE_IOS(9_0);

typedef NS_ENUM(NSUInteger, UIDynamicItemCollisionBoundsType) {
    // 矩形碰撞邊界
    UIDynamicItemCollisionBoundsTypeRectangle,
    // 橢圓形碰撞邊界,橢圓的形狀是由元素的寬度和高度決定
    UIDynamicItemCollisionBoundsTypeEllipse,
    // 基于路徑碰撞邊界兼贸。這種類型的形狀是一個UIBezierPath對象存儲在元素的collisionBoundingPath屬性中段直。
    UIDynamicItemCollisionBoundsTypePath
} NS_ENUM_AVAILABLE_IOS(9_0);
/**
碰撞路徑
該路徑必須是一個凸的多邊形圍繞而成,并且沒有自身的交叉
(0,0) 代表路徑的中心
(翻譯自官方文檔)
 */
@property (nonatomic, readonly) UIBezierPath *collisionBoundingPath NS_AVAILABLE_IOS(9_0);

代碼補充:

補充演示中的代碼溶诞,方便后續(xù)文章的理解:

_dynamicItem1View = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 50, 50)];
_dynamicItem1View.backgroundColor    = [UIColor blueColor];
_dynamicItem1View.layer.cornerRadius = 25;
[self.view addSubview:_dynamicItem1View];
_dynamicItem2View = [[UIView alloc] initWithFrame:CGRectMake(160, 250, 100, 100)];
_dynamicItem2View.backgroundColor    = [UIColor blackColor];
_dynamicItem2View.layer.cornerRadius = 50;
[referenceView addSubview:_dynamicItem2View];

iOS UIKit動力學(二)重力(UIGravityBehavior)
iOS UIKit動力學(三)碰撞(UICollisionBehavior)
iOS UIKit動力學(四)吸附(UIAttachmentBehavior)
iOS UIKit動力學(五)推動(UIPushBehavior)
iOS UIKit動力學(六)捕獲(UISnapBehavior)
iOS UIKit動力學(七)其它動力學配置(UIDynamicItemBehavior)


版權聲明:出自MajorLMJ技術博客的原創(chuàng)作品 鸯檬,轉(zhuǎn)載時必須注明出處及相應鏈接!

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末螺垢,一起剝皮案震驚了整個濱河市喧务,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌枉圃,老刑警劉巖功茴,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異孽亲,居然都是意外死亡坎穿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門返劲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赁酝,“玉大人,你說我怎么就攤上這事旭等∽么簦” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵搔耕,是天一觀的道長隙袁。 經(jīng)常有香客問我痰娱,道長,這世上最難降的妖魔是什么菩收? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任梨睁,我火速辦了婚禮,結果婚禮上娜饵,老公的妹妹穿的比我還像新娘坡贺。我一直安慰自己,他們只是感情好箱舞,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布遍坟。 她就那樣靜靜地躺著,像睡著了一般晴股。 火紅的嫁衣襯著肌膚如雪愿伴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天电湘,我揣著相機與錄音隔节,去河邊找鬼。 笑死寂呛,一個胖子當著我的面吹牛怎诫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播贷痪,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼刽虹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了呢诬?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤胖缤,失蹤者是張志新(化名)和其女友劉穎尚镰,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哪廓,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡狗唉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了涡真。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片分俯。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖哆料,靈堂內(nèi)的尸體忽然破棺而出缸剪,到底是詐尸還是另有隱情,我是刑警寧澤东亦,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布杏节,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏奋渔。R本人自食惡果不足惜镊逝,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嫉鲸。 院中可真熱鬧撑蒜,春花似錦、人聲如沸玄渗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捻爷。三九已至辈灼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間也榄,已是汗流浹背巡莹。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留甜紫,地道東北人降宅。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像囚霸,于是被迫代替她去往敵國和親腰根。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容

  • iOS 7增加了UIKit Dynamics庫拓型,其集成于UIKit框架中额嘿,將2D物理引擎引入了UIKit,提供了以...
    pro648閱讀 2,807評論 2 14
  • 一劣挫、簡單介紹 1.什么是UIDynamicUIDynamic是從iOS 7開始引入的一種新技術册养,隸屬于UIKit框...
    洛洛愛吃肉閱讀 666評論 0 12
  • UIKit動力學最大的特點是將現(xiàn)實世界動力驅(qū)動的動畫引入了UIKit,比如重力压固,鉸鏈連接球拦,碰撞,懸掛等效果帐我,即將2...
    BarleyZ閱讀 1,287評論 0 49
  • 本文中所有代碼演示均有GitHub源碼坎炼,點擊下載 UIDynamic簡介 簡介:UIKit動力學最大的特點是將現(xiàn)實...
    si1ence閱讀 10,230評論 8 79
  • 坐在車上谣光,好無聊 形形色色的人都不像你 低頭的,發(fā)呆的 竟然還有癡笑的 翻起隨身攜帶的書 滿滿都是字 沒有一幅插畫...
    郭青年閱讀 266評論 0 1