IOS動(dòng)畫系列之靈動(dòng)的日程界面

6F8C6BB2-CB6F-4101-A215-2CF1FE7B18C3.png

下面的gif是我在動(dòng)畫網(wǎng)站上看到比較好看的動(dòng)畫瞭空,然后我就想試著自己寫出這個(gè)動(dòng)畫始鱼。


原型動(dòng)畫.gif

下面是我試著實(shí)現(xiàn)動(dòng)畫的gif


ScheduleAni.gif

先說說我實(shí)現(xiàn)原型動(dòng)畫中那些不足的地方吧臀防!

  1. 界面的層次結(jié)構(gòu)不是很明顯为流,主要沒有去實(shí)現(xiàn)弧形的漸變酸茴。
  2. 沒有實(shí)現(xiàn)cell的滑動(dòng)刪除。
  3. 如果你看了代碼后沼本,我這只適配了一種動(dòng)畫噩峦,而沒有適配一種通用的動(dòng)畫。

接著我們說說我這個(gè)動(dòng)畫用到那些知識(shí)吧抽兆!

  1. 界面的幾個(gè)部分View的層次結(jié)構(gòu)识补,涉及到陰影和layer層的zPosition.
  2. 自定義的UICollectionView和UITableView。
  3. 動(dòng)畫的書寫和其先后執(zhí)行辫红。
  4. View的center算法

代碼我會(huì)放在我github上凭涂,在這兒我就對(duì)其中一些比較難實(shí)現(xiàn)的部分說明一下吧。

View.png

]

圖層的3D結(jié)構(gòu)

代碼:

_suspendView = [[SuspendView alloc]
                            initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH/5.0, 130)];
        _suspendView.top = self.topView.bottom;
        _suspendView.centerX = self.topView.centerX;
        _suspendView.layer.shadowColor = [UIColor blackColor].CGColor;
        _suspendView.layer.shadowOffset = CGSizeMake(-4, 8);
        _suspendView.layer.shadowOpacity = 0.8;
        _suspendView.layer.shadowRadius = 4;
        _suspendView.backgroundColor = SUSPEND_COLOR;
        _suspendView.layer.zPosition = 2;


_weekView = [[DynamicWeekView alloc] initWithFrame:CGRectMake(0, self.topView.bottom, SCREEN_WIDTH, 120) collectionViewLayout:layout];
        _weekView.layer.shadowColor = [UIColor blackColor].CGColor;
        _weekView.layer.shadowOffset = CGSizeMake(4, 8);
        _weekView.layer.shadowOpacity = 0.8;
        _weekView.layer.shadowRadius = 4;
        _weekView.layer.zPosition = 1;


_topView = [[UIView alloc]initWithFrame:CGRectMake(0, 20, SCREEN_WIDTH, 44)];
        _topView.layer.shadowColor = [UIColor blackColor].CGColor;
        _topView.layer.shadowOffset = CGSizeMake(4, 8);
        _topView.layer.shadowOpacity = 0.8;
        _topView.layer.shadowRadius = 4;
        _topView.backgroundColor = TOPBG_COLOR;
        _topView.layer.zPosition = 3;


 [self.view addSubview:self.weekView];
 [self.view addSubview:self.suspendView];
 [self.view addSubview:self.topView];

可以看到在同一個(gè)視圖添加別的View贴妻,如果想要實(shí)現(xiàn)視圖的層次感切油,
就需要加上陰影和 View.layer.zPosition = number;這樣就可以去實(shí)現(xiàn)結(jié)構(gòu)層次。

在自定義UICollectionView后滑動(dòng)時(shí)只是移動(dòng)一個(gè)cell的距離名惩。
代碼:

        self.gestureRecognizers = nil;
        UISwipeGestureRecognizer *gestureLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(collectionViewSwipped:)];
        gestureLeft.direction = UISwipeGestureRecognizerDirectionLeft;
        UISwipeGestureRecognizer *gestureRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(collectionViewSwipped:)];
        gestureRight.direction = UISwipeGestureRecognizerDirectionRight;
        [self addGestureRecognizer:gestureLeft];
        [self addGestureRecognizer:gestureRight];

這樣就可以屏蔽UICollectionView原有的滑動(dòng)手勢(shì)澎胡。

        float space = 0;
        float viewWidth = SCREEN_WIDTH/5.0;
        //滑動(dòng)的時(shí)候判斷
        if (self.contentSize.width - self.contentOffset.x - SCREEN_WIDTH/5.0 < SCREEN_WIDTH) {
            
            self.contentSize = CGSizeMake(self.contentSize.width + SCREEN_WIDTH/5.0 * 2,
                                          SCREEN_WIDTH/5.0 - 10);
        }
        [self scrollRectToVisible:CGRectMake((self.currentIdx - 2) * (viewWidth + space),
                                             0,
                                             self.frame.size.width,
                                             self.frame.size.height)
                         animated:YES];

這段代碼主要是滑動(dòng)后cell會(huì)移動(dòng)一個(gè)cell距離,但需要注意的是分別取處理兩端的時(shí)候的滑動(dòng)娩鹉。

動(dòng)畫:在這里只有視圖的frame攻谁,center,以及alpha變化的動(dòng)畫弯予。View層做動(dòng)畫一般是frame.alpha的動(dòng)畫戚宦,只需要放在蘋果官方的方法中去實(shí)現(xiàn)即可。而當(dāng)需要自定義動(dòng)畫時(shí)就需要layer層去做處理熙涤,去設(shè)置其中的路徑阁苞,這時(shí)的路徑一般貝塞爾曲線完成,然后放在一個(gè)動(dòng)畫對(duì)象中去實(shí)現(xiàn)祠挫。

當(dāng)然這里的動(dòng)畫知識(shí)View層的變化那槽。可以用一組幀動(dòng)畫去實(shí)現(xiàn)等舔,其中有cell的點(diǎn)擊動(dòng)畫-->logo的彈出動(dòng)畫-->利用layer層和貝塞爾生成圓圈動(dòng)畫-->logo的運(yùn)行動(dòng)畫骚灸。

部分代碼:

[UIView animateWithDuration:0.4 delay:0 usingSpringWithDamping:0.8 initialSpringVelocity:0 options:0 animations:^{
        self.coverView.alpha = 0.4;
        centerBtn.center = CGPointMake(SCREEN_WIDTH/2.0, 2*SCREEN_HEIGHT/3.0);
    } completion:^(BOOL finished) {
        
        [UIView animateWithDuration:0.5 delay:0 usingSpringWithDamping:0.8 initialSpringVelocity:0 options:0 animations:^{
            [ExpandModel expandToNewCenterWithViews:self.logoBtnArr andCenterP:centerBtn.center];
        } completion:^(BOOL finished) {
            [UIView animateWithDuration:0.3 animations:^{
                [self.circleLayer setStrokeColor:[UIColor yellowColor].CGColor];
            }];
        }];
        
    }];

這個(gè)logo運(yùn)動(dòng)后cented的確定,因?yàn)楫?dāng)滑動(dòng)tableView后慌植,得根據(jù)contentoffset去確定logo運(yùn)動(dòng)到你點(diǎn)擊的cell上甚牲,這個(gè)時(shí)候利用contentoffset去實(shí)現(xiàn)。

NSIndexPath *indexPath = [weakSelf.tableView indexPathForCell:weakSelf.scheduleCell];
CGFloat y = (indexPath.row + 1) * weakSelf.scheduleCell.height + tableView.bottom - weakSelf.contentOffY - weakSelf.scheduleCell.height/2.0;

其余就是一些基礎(chǔ)的代碼的書寫了蝶柿,例如點(diǎn)擊后需要傳出的參數(shù)丈钙,視圖的創(chuàng)建封裝等。
最后附上代碼地址:https://github.com/CoDancer/DynamicSchedule

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末交汤,一起剝皮案震驚了整個(gè)濱河市雏赦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖星岗,帶你破解...
    沈念sama閱讀 212,029評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件填大,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡俏橘,警方通過查閱死者的電腦和手機(jī)允华,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寥掐,“玉大人靴寂,你說我怎么就攤上這事〔苷蹋” “怎么了榨汤?”我有些...
    開封第一講書人閱讀 157,570評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)怎茫。 經(jīng)常有香客問我收壕,道長(zhǎng),這世上最難降的妖魔是什么轨蛤? 我笑而不...
    開封第一講書人閱讀 56,535評(píng)論 1 284
  • 正文 為了忘掉前任蜜宪,我火速辦了婚禮,結(jié)果婚禮上祥山,老公的妹妹穿的比我還像新娘圃验。我一直安慰自己,他們只是感情好缝呕,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評(píng)論 6 386
  • 文/花漫 我一把揭開白布澳窑。 她就那樣靜靜地躺著,像睡著了一般供常。 火紅的嫁衣襯著肌膚如雪摊聋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,850評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼撕彤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛煎源,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播香缺,決...
    沈念sama閱讀 39,006評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼手销,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了图张?” 一聲冷哼從身側(cè)響起原献,我...
    開封第一講書人閱讀 37,747評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤馏慨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后姑隅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,207評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡倔撞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評(píng)論 2 327
  • 正文 我和宋清朗相戀三年讲仰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痪蝇。...
    茶點(diǎn)故事閱讀 38,683評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鄙陡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出躏啰,到底是詐尸還是另有隱情趁矾,我是刑警寧澤,帶...
    沈念sama閱讀 34,342評(píng)論 4 330
  • 正文 年R本政府宣布给僵,位于F島的核電站毫捣,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏帝际。R本人自食惡果不足惜蔓同,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評(píng)論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蹲诀。 院中可真熱鬧斑粱,春花似錦、人聲如沸脯爪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)痕慢。三九已至尚揣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間守屉,已是汗流浹背惑艇。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拇泛,地道東北人滨巴。 一個(gè)月前我還...
    沈念sama閱讀 46,401評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像俺叭,于是被迫代替她去往敵國(guó)和親恭取。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評(píng)論 2 349

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)熄守、插件蜈垮、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,066評(píng)論 4 62
  • 今天又失敗了攒发! 是的调塌,又! 想來畢業(yè)后惠猿,自己做的事羔砾,失敗了一件又一件!最恐怖的是偶妖,在我一敗涂地的時(shí)候姜凄,不經(jīng)意間我發(fā)...
    傾陽(yáng)解憂閱讀 179評(píng)論 0 0
  • 一周前的瘋狂情愫已逐漸消逝,甚至我也難以想象自己的善于轉(zhuǎn)變趾访。他說不回復(fù)我是為了好讓我好好學(xué)習(xí)态秧,不能耽誤我的...
    寧?kù)o且明亮閱讀 544評(píng)論 0 1
  • 人生若只如初見。 ——題記 這個(gè)深秋的城市扼鞋,街道又鋪滿了銀杏申鱼。娟子一如既往,...
    假如風(fēng)來過閱讀 376評(píng)論 0 0
  • 每天進(jìn)步一點(diǎn)點(diǎn)藏鹊,堅(jiān)持帶來大改變润讥。 最近遭受到了比較多讓自己燃起怒火的事情。工作中最討厭的是其他部門的資料給自己帶來...
    南緯_北緯閱讀 165評(píng)論 0 1