動畫五

開始思考上面留下的兩個問題杭煎。

TableView的過渡動畫思路

先從taleView的過渡開始,這個我是做了很多的測試毒返,如果我們把bgView繼承改成TableView的話挤聘,在放大的過程中,cell的高度不會變衣盾,就會橫向拉長寺旺,會很丑,然后再刷地一下恢復正常势决。后來我在約束的設置中引入了Scala參數阻塑,就是根據bgView 和 屏幕寬的 比例,整體把約束乘上這個參數果复,但是效果還是不盡如人意陈莽,從我的感覺來看還是不好看。 就是這么個東西虽抄,感興趣可以試一下走搁,也許再微調一下效果就比較好。

((ScreenWidth * (3.0 / 5)) / ScreenWidth)

后來我思考我們既然可以拿到下一個控制器迈窟,那就是說可以把下個控制器里的tableview按一定的高度截成圖朱盐,然后在轉場里面?zhèn)鬟f給bgView,這樣就是可以很完美的匹配菠隆,但是在開始之初,因為collectionViewCell的寬高比的原因,就拉長的不大好骇径,但是我們可以把這個cell的寬高調整一下躯肌,這樣效果應該就會好。
總體來說破衔,這兩個思路都是可行的清女,但是又懶得大改了,所以我再嘗試后晰筛,就先放著嫡丙,后來做完頭像移動后,覺得好像不用這個也還行读第,就沒做曙博,可以自行去嘗試一下。

所以接下去怜瞒,我們繼續(xù)講頭像移動

CAKeyframeAnimation關鍵幀動畫

        UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage circleImage:[NSString stringWithFormat:@"%ld",(i + 1) * 10]]];
        imageView.frame = CGRectMake(0, 0, 30, 30);
        imageView.center = point;
    
        UIWindow *keyW = [UIApplication sharedApplication].keyWindow;
        [keyW addSubview:imageView];
    
        CAKeyframeAnimation *anim = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    
        UIBezierPath *path = [UIBezierPath bezierPath];
        [path moveToPoint:point];
    
        CGPoint endP = CGPointFromString(_arrM[i]);
        [path addLineToPoint:endP];
    
        anim.path = path.CGPath;
        anim.duration = AnimationDuration;
        anim.delegate = self;
    
        imageView.center = endP;
    
        [anim setValue:imageView forKey:@"LL"];
    
        [imageView.layer addAnimation:anim forKey:nil];

這個動畫在我們應用起來就有幾個難點父泳,因為我們不用考慮曲線問題,也是那個貝塞爾點是不用計算指定的吴汪,只要起點和終點惠窄,但是就起點和終點而言,都由于嵌套深的緣故漾橙,他們的位置都不好獲取杆融,所以就要想點辦法

UIWindow *keyW = [UIApplication sharedApplication].keyWindow;
- (CGRect)convertRect:(CGRect)rect toView:(nullable UIView *)view;

通過這兩個方法,來計算某個控件在父控件中的位置相對于大屏幕的位置是比較常見的霜运,但是它們有一個缺陷脾歇,就是只能用來計算嵌套相對較少的情況,深的話會不準觉渴,我呢介劫,就比較懶,我就用這套方法案淋,反復試驗了幾次座韵,找到了在collectionViewCell里面的用戶視圖的位置,但是這個位置x是可以直接的獲取踢京,y的話獲取以后要加一個cell的高度然后還有一個 -12的偏移誉碴,要是屏幕適配的話,應該去 -12可能會有不同瓣距,測試一下黔帕,加個版本判斷也是可以的,因為這是個耗時的操作蹈丸,所以我就直接用了這個結果成黄,90 + i * 25, 141 + (ScreenHeight * (5.0 / 9))矛物,但是我是推薦不要用這種魔法數字,當然我是獲取到的践盼,因為比較懶就直接用結果了环础,哈哈。

然后后面我們要解決的是終點的位置闻伶,我們起初用的是UITableViewAutomaticDimension這個東西在自動計算行高的滨攻,但是這樣算完他不會給行高具體是多少,所以我們就要修改一下蓝翰,用那種自己算的方法來光绕,自己算就是算個評論的高度,用這個就行

CGSize size = [model.userComment boundingRectWithSize:CGSizeMake(ScreenWidth - 15, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:14]} context:nil].size;

然后我們在模型的set方法里面進行更新初始化的約束,但是不要直接把UI初始化放在里面畜份,會有復用的問題诞帐,僅僅根據size.height更新一下高度約束就好

[self.userComment mas_updateConstraints:^(MASConstraintMaker *make) {
        make.height.equalTo(@(size.height));
    }];

但是因為我們用的是約束這種東西,他們比frame運算靠后漂坏,所以比較麻煩景埃,還好有個layoutIfNeeded,我們在更新完約束以后顶别,調用一下這個方法谷徙,讓他直接算出來位置,不然的話驯绎,當時是沒辦法獲取位置的

[self layoutIfNeeded];

之后我們就可以用個屬性把它的高度獲取到傳遞到外面

- (CGFloat)cellHeight
{
    return CGRectGetMaxY(self.userComment.frame) + 15;
}

然后我們在控制器的返回行高的方法里完慧,獲取到行高,計算頭像位置剩失,存到一個數組里面屈尼,這樣我們就可以在轉場動畫里面把這個數組獲取到

- (NSMutableArray *)calculatePicCenter
{
    NSMutableArray *arr = [NSMutableArray arrayWithCapacity:4];
    CGFloat start = TitleViewHeight + TopViewHeight;
    CGFloat centerX = 30;
    for (NSInteger i = 0; i < 4; i++) {
        CGFloat centerY = start + 10 + 15;
        [arr addObject:NSStringFromCGPoint(CGPointMake(centerX, centerY))];
        start += [self.arrCellHeight[i] floatValue];
    }
    return arr;
}

然后就可以順利的去實現我們的動畫,執(zhí)行完成以后把圖片移除就好了拴孤。

- (void)animation:(NSInteger)count
{
    //90 + i * 25, 141 + (ScreenHeight * (5.0 / 9)) 脾歧?
    
    for (NSInteger i = 0; i < count; i++) {
        CGPoint point = CGPointMake(90 + i * 25, 141 + (ScreenHeight * (5.0 / 9)));
    
        UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage circleImage:[NSString stringWithFormat:@"%ld",(i + 1) * 10]]];
        imageView.frame = CGRectMake(0, 0, 30, 30);
        imageView.center = point;
    
        UIWindow *keyW = [UIApplication sharedApplication].keyWindow;
        [keyW addSubview:imageView];
    
        CAKeyframeAnimation *anim = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    
        UIBezierPath *path = [UIBezierPath bezierPath];
        [path moveToPoint:point];
    
        CGPoint endP = CGPointFromString(_arrM[i]);
        [path addLineToPoint:endP];
    
        anim.path = path.CGPath;
        anim.duration = AnimationDuration;
        anim.delegate = self;
    
        imageView.center = endP;
    
        [anim setValue:imageView forKey:@"LL"];
    
        [imageView.layer addAnimation:anim forKey:nil];
    }
}

//動畫停止的代理
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
    //從anim中取出圖片,移除
    UIImageView *imgV = [anim valueForKey:@"LL"];
    [imgV removeFromSuperview];
}

還有一個細節(jié)性的問題演熟,就是這樣的話鞭执,我們轉場的時候原有的用戶視圖還是會存在的,這是因為我們之前約束芒粹,層次的關系兄纺,即便我們讓它隱藏,也得是再執(zhí)行完動畫才能隱藏化漆,所以要做的就是在對應的位置更改用戶頭像的約束估脆,讓它直接依附于shadowView,然后就可以在這里直接隱藏了座云,這樣我們的動畫就算基本完成了疙赠。

效果是這樣的:

3月-16-2018 11-38-38.gif

現在還存在幾個問題付材,就是留給別人去處理的,我要去做正事了棺聊,哈哈伞租,當然都是小問題
1.:我的模擬器iphone7上的轉場會有問題,我因為很長時間不動這套了限佩,不知道他們有什么變化沒,所以可以看看
2.:上面談到的頭像移動的起始位置的魔法值的問題
3.: 那個TableView過渡動畫添加的問題
4.:把數據甩出去裸弦,正正經經做個對接口
5.:代碼沒有實體文件夾祟同,很亂
我的代碼放在鏈接: https://pan.baidu.com/s/1VruBLLZY9htHhI5wIMpfPg 密碼: sywf ,是里面是對應這個目錄的五份代碼理疙,其實前面的3份自己去實現都是比較容易的晕城。
另外,就是在后面可能(- -窖贤。等我有空吧)砖顷,會更新一些別的,比如一些現在app里面好玩的效果功能赃梧,還有大型框架的邏輯滤蝠,仿寫這些。授嘀。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末物咳,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子蹄皱,更是在濱河造成了極大的恐慌览闰,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巷折,死亡現場離奇詭異压鉴,居然都是意外死亡,警方通過查閱死者的電腦和手機锻拘,發(fā)現死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門油吭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人逊拍,你說我怎么就攤上這事上鞠。” “怎么了芯丧?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵芍阎,是天一觀的道長。 經常有香客問我缨恒,道長谴咸,這世上最難降的妖魔是什么轮听? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮岭佳,結果婚禮上血巍,老公的妹妹穿的比我還像新娘。我一直安慰自己珊随,他們只是感情好述寡,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著叶洞,像睡著了一般鲫凶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上衩辟,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天螟炫,我揣著相機與錄音,去河邊找鬼艺晴。 笑死昼钻,一個胖子當著我的面吹牛,可吹牛的內容都是我干的封寞。 我是一名探鬼主播然评,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼钥星!你這毒婦竟也來了沾瓦?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤谦炒,失蹤者是張志新(化名)和其女友劉穎贯莺,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體宁改,經...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡缕探,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了还蹲。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爹耗。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖谜喊,靈堂內的尸體忽然破棺而出潭兽,到底是詐尸還是另有隱情,我是刑警寧澤斗遏,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布山卦,位于F島的核電站,受9級特大地震影響诵次,放射性物質發(fā)生泄漏账蓉。R本人自食惡果不足惜枚碗,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铸本。 院中可真熱鬧肮雨,春花似錦、人聲如沸箱玷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锡足。三九已至椅亚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間舱污,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工弥虐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留扩灯,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓霜瘪,卻偏偏與公主長得像珠插,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子颖对,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內容

  • 親愛的你好捻撑,照片修完了。鏈接見上缤底,建議下載到電腦上顾患,下載完成,您微信留言告訴我一聲个唧,我就把云盤上您的照片刪除江解。 親...
    小米_PHOTO閱讀 145評論 0 0
  • 本書作者: 李富生,詩協(xié)會員徙歼。 鳥鳴院林花郁香犁河,癡情才俊心蕩漾;駐步凝神勾文章魄梯,不得佳句斷愁腸桨螺。
    小啟明星閱讀 199評論 3 5
  • *五月底的杭州。剛結束梅雨季酿秸,又不至于太熱灭翔,葉子還帶著新綠,早晚還帶著一股薄薄的涼意允扇。 *站在寶石山上缠局、保俶塔前则奥,...
    Caniceee閱讀 600評論 5 16
  • 李一十八閱讀 246評論 0 1
  • 關于作者 吉姆·柯明斯,資深的廣告專家狭园,在多家機構擔任首席戰(zhàn)略規(guī)劃師读处。 關于本書 一本關于如何說服他人的工具書。想...
    陋室鳴閱讀 4,156評論 0 0