JazzHands框架使用

OC版 https://github.com/IFTTT/JazzHands
switf版 https://github.com/IFTTT/RazzleDazzle

簡介

Jazz Hand是一個(gè)簡單的基于keyframe的UIKit動(dòng)畫框架闲先。動(dòng)畫可以通過手勢(shì),scrollviews,Kvo或者ReactiveCocoa控制。常見用途:制作一個(gè)拖動(dòng)動(dòng)畫的引導(dǎo)頁.以下是我寫的一個(gè)Demo.

Demo
Demo

安裝

OC版:

pod "JazzHands"

swift版:

    pod "RazzleDazzle"

類圖

jazzhand
jazzhand
  • IFTTTAnimatior
    導(dǎo)演類,里面有一個(gè)動(dòng)畫(IFTTTAnimation)數(shù)組管理所有動(dòng)畫的添加/刪除/執(zhí)行.

  • IFTTTAnimatable
    執(zhí)行動(dòng)畫類.
    重要: 定義了核心協(xié)議(接口),animate:(CGFloat)time; 計(jì)算每一個(gè)時(shí)間點(diǎn)當(dāng)前對(duì)象的值.每一種動(dòng)畫都要實(shí)現(xiàn)這個(gè)接口.如IFTTTAlphaAnimation類,計(jì)算一個(gè)時(shí)間點(diǎn)對(duì)應(yīng)的對(duì)象的alpha值

  • IFTTTAnimation
    動(dòng)畫基類,定義了一個(gè)對(duì)象的動(dòng)畫.僅僅只是對(duì)類中的IFTTTFilemstrip進(jìn)行一個(gè)簡單的封裝.

    注: 每種動(dòng)畫都繼承IFTTTAnimation和實(shí)現(xiàn)<IFTTTAnimatable>協(xié)議才會(huì)正常工作.

  • IFTTTFilmstrip
    膠片類,有一個(gè)關(guān)鍵幀(IFTTTKeyframe)數(shù)組.,添加/修改/獲取對(duì)應(yīng)關(guān)鍵幀(IFTTTKeyframe)的值.通過valueAtTime:可以計(jì)算兩個(gè)相鄰關(guān)鍵幀之間的的值.這個(gè)值在執(zhí)行動(dòng)畫時(shí)- animate使用.

  • IFTTTKeyframe
    關(guān)鍵幀類,描述每一個(gè)關(guān)鍵幀的時(shí)間對(duì)應(yīng)的值.

分析:

jazzhand主要應(yīng)用在scrollviews,同時(shí)封裝了IFTTTAnimatedPagingScrollViewController方便我們繼承使用.目前這個(gè)類scrollview只支持橫向滾動(dòng),并不支持縱向滾動(dòng).jazzhand框架是基于關(guān)鍵幀的動(dòng)畫,這個(gè)概念其實(shí)跟Core Animation 的概念是一樣的. 只不過跟core Animation有不同一點(diǎn)的是,jazzhand框架的動(dòng)畫驅(qū)動(dòng)是坐標(biāo)驅(qū)動(dòng).
舉個(gè)例子,在Core Animation中,我們只需要設(shè)置軌跡,方向,時(shí)間就可以提交了.接下就由Core Animation負(fù)責(zé)計(jì)算,就可以看到App能執(zhí)行一段動(dòng)畫.這里設(shè)置了時(shí)間5s.在APP接下來的5s中,Core Animation每1/30秒重新計(jì)算一次imageview的位置并調(diào)用[self ifNeedLayout]方法進(jìn)行更行.然后就形成了我們所看到的動(dòng)畫.

      [UIView beginAnimations:@"jk" context:nil];
    //    設(shè)置動(dòng)畫的方向
        [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:imageView cache:YES];
    //    設(shè)置動(dòng)畫持續(xù)時(shí)間
        [UIView setAnimationDuration:5];
    //   設(shè)置動(dòng)畫效果過渡的狀態(tài)
        [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    //    提交動(dòng)畫
        [UIView commitAnimations];
    }

但是Jazzhand中,卻以scrollview.contentOffset作為動(dòng)畫執(zhí)行的time,在[scrollview didScroll]代理中重新計(jì)算視圖的位置.

坐標(biāo)位移
坐標(biāo)位移

在Jazzhand中有一個(gè)重要的方法

- (void)keepView:(UIView *)view
         onPages:(NSArray *)pages
         atTimes:(NSArray *)times
     withOffsets:(NSArray *)offsets    
   withAttribute:(IFTTTHorizontalPositionAttribute)attribute

pages和offsets的個(gè)數(shù)要相同.不然會(huì)產(chǎn)生致命錯(cuò)誤(crash)

其中每個(gè)page和time對(duì)應(yīng)的是:

view.frame.size.x = page * pageWidth
scrollview.contentOffset = time * pageWidth

當(dāng)time = 1時(shí), 即scrollview滾到第二頁的時(shí)候,scrollview.contentOffset=(pageWidth * 1).然后我們必須設(shè)置時(shí)間time所對(duì)應(yīng)的view的位置.可以想象每拖動(dòng)一個(gè)頁面,相當(dāng)于view對(duì)象進(jìn)行時(shí)間0到1的動(dòng)畫.
每一個(gè)動(dòng)畫(animation)都擁有一個(gè)膠卷(filmstrip),每一個(gè)膠卷都包含該了該動(dòng)作的所有關(guān)鍵幀(keyframe).隨著屏幕拖拽,JazzHands會(huì)根據(jù)約束和時(shí)間(contentOffset)計(jì)算對(duì)象的位置.只要刷新的頻率只夠高.我們?nèi)搜劬涂床怀鍪侵匦庐嬌先?而是連續(xù)的動(dòng)畫了.

使用:

  1. @interface IntrotductionController:IFTTTAnimatedPagingScrollViewController

IFTTTAnimatedPagingScrollViewController繼承viewcontroller,有子成員scrollview,封裝了contentview.所以只需要將對(duì)象加入到contentview中就可以.

  1. 重載 numberOfPage方法系統(tǒng)默認(rèn)是2
  2. 如果不需要,就不要給對(duì)象添加約束.

不要給x值添加約束. 原因見4.

  1. [self keepView:self.circle onPages:@[@(0), @(1)]]; 設(shè)置對(duì)象的x值的關(guān)鍵幀. 這句代碼的意思是,當(dāng)視圖view移動(dòng)到scrollviewcontentOffset為0時(shí)circle的位置也為0, 當(dāng)拖動(dòng)到contentOffset為1時(shí),circle的位置也是1,這句代碼內(nèi)部幫對(duì)象添加了x值的約束.如果你之前為x值添加其他約束,這里在運(yùn)行時(shí)候回出現(xiàn)約束沖突錯(cuò)誤.同時(shí)我們只能選擇對(duì)象在屏幕中左中右三個(gè)相對(duì)位置.

注: 使對(duì)象相對(duì)于屏幕位置不動(dòng)的方法

        // 設(shè)置time即contentOffset不變,即使相對(duì)屏幕不變.
        // 在index-1滑動(dòng)到index時(shí),leimuImgHeart的位置從index-1.15滑動(dòng)到index-0.15.兩者滑動(dòng)的距離相等,速度相等.
        // 所以視覺上是相對(duì)于屏幕位置不變.同時(shí),第4中不設(shè)置times參數(shù)也是默認(rèn)相對(duì)于屏幕位置不變
    [self keepView:leimuImgHeart onPages:@[@(index-1.15),@(index-0.15), @(index-1.15)] atTimes:@[@(index-1),@(index),@(index+1)] withAttribute:IFTTTHorizontalPositionAttributeCenterX offset:0];  

Time變化引起offset變化,leimuImgHeart也得同步跟time一起變化

  1. 定義你自己的動(dòng)畫

             // 最好使用autolayout固定視圖的位置
       NSLayoutConstraint * topConstraint = [NSLayoutConstraint constraintWithItem:leimuImgHeart      attribute:NSLayoutAttributeCenterY                      relatedBy:NSLayoutRelationEqual                  toItem:self.contentView
             attribute:NSLayoutAttributeTop          multiplier:1.0 constant:0.f];
         [self.contentView addConstraint:topConstraint];
         // 添加一個(gè)約束幀動(dòng)畫,即約束隨time的變化而變化
         IFTTTConstraintMultiplierAnimation *constantAnimation = [IFTTTConstraintMultiplierAnimation animationWithSuperview:self.contentView         constraint:topConstraint                attribute:IFTTTLayoutAttributeHeight             referenceView:self.contentView];
         [constantAnimation addKeyframeForTime:index-1 multiplier:-0.2f];
         [constantAnimation addKeyframeForTime:index multiplier:0.3f];
         [self.animator addAnimation:constantAnimation];
    

demo地址: https://github.com/johnMaster/JazzhandsDemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市铁蹈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖蚀浆,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡市俊,警方通過查閱死者的電腦和手機(jī)杠输,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秕衙,“玉大人蠢甲,你說我怎么就攤上這事【萃” “怎么了鹦牛?”我有些...
    開封第一講書人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長勇吊。 經(jīng)常有香客問我曼追,道長,這世上最難降的妖魔是什么汉规? 我笑而不...
    開封第一講書人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任礼殊,我火速辦了婚禮,結(jié)果婚禮上针史,老公的妹妹穿的比我還像新娘晶伦。我一直安慰自己,他們只是感情好啄枕,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開白布婚陪。 她就那樣靜靜地躺著,像睡著了一般频祝。 火紅的嫁衣襯著肌膚如雪泌参。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,337評(píng)論 1 310
  • 那天常空,我揣著相機(jī)與錄音沽一,去河邊找鬼。 笑死漓糙,一個(gè)胖子當(dāng)著我的面吹牛铣缠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播兼蜈,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼攘残,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了为狸?” 一聲冷哼從身側(cè)響起歼郭,我...
    開封第一講書人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辐棒,沒想到半個(gè)月后病曾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體牍蜂,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年泰涂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鲫竞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡逼蒙,死狀恐怖从绘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情是牢,我是刑警寧澤僵井,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站驳棱,受9級(jí)特大地震影響批什,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜社搅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一驻债、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧形葬,春花似錦合呐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽青扔。三九已至源织,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間微猖,已是汗流浹背谈息。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凛剥,地道東北人侠仇。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像犁珠,于是被迫代替她去往敵國和親逻炊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

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

  • 在iOS中隨處都可以看到絢麗的動(dòng)畫效果犁享,實(shí)現(xiàn)這些動(dòng)畫的過程并不復(fù)雜余素,今天將帶大家一窺ios動(dòng)畫全貌。在這里你可以看...
    每天刷兩次牙閱讀 8,514評(píng)論 6 30
  • 1炊昆、設(shè)置UILabel行間距 NSMutableAttributedString* attrString = [[...
    十年一品溫如言1008閱讀 1,663評(píng)論 0 3
  • { 11桨吊、核心動(dòng)畫 需要簽協(xié)議威根,但是系統(tǒng)幫簽好 一、CABasicAnimation 1视乐、創(chuàng)建基礎(chǔ)動(dòng)畫對(duì)象 CAB...
    CYC666閱讀 1,557評(píng)論 2 4
  • 1洛搀、設(shè)置UILabel行間距 NSMutableAttributedString* attrString = [[...
    FF_911閱讀 1,383評(píng)論 0 3
  • 在iOS中隨處都可以看到絢麗的動(dòng)畫效果,實(shí)現(xiàn)這些動(dòng)畫的過程并不復(fù)雜佑淀,今天將帶大家一窺iOS動(dòng)畫全貌留美。在這里你可以看...
    F麥子閱讀 5,115評(píng)論 5 13