iOS WHBubbleTransition(自定義VC轉(zhuǎn)場動(dòng)畫)

開門見山强法,先看效果圖:

自定義轉(zhuǎn)場動(dòng)畫.gif

自定義 UIViewController Present 樣式摩桶,shrinking bubble 收縮和擴(kuò)張的泡沫赴精。動(dòng)畫來源于
https://github.com/andreamazz/BubbleTransition

對(duì)此進(jìn)行了一些改進(jìn):

1. 把 swift 源碼翻譯成 OC

2. 改進(jìn)了一些動(dòng)畫機(jī)制完沪,具體如下

BubbleTransition效果圖.gif

從它給的效果圖來看息尺,升縮的效果非常贊 (~ ̄▽ ̄~) ——

但是携兵。。

聰明的你可能已經(jīng)看見了搂誉,圖中的兩個(gè) ViewController 背景就是純色徐紧,上面沒任何其他 View,所以顯得效果很贊炭懊。接下來我們看一下加上 View 的效果——

背景添加了一張圖片.gif
這就尷尬了 a( ̄3 ̄)a ——

利用 Reveal 我們看看 View 的層次結(jié)構(gòu)并级。

Reveal結(jié)果.png

中間那一層遠(yuǎn)大于375 x 667的 View 很引人注目呀 (#-.-)——

再來看看代碼:

//計(jì)算一些關(guān)鍵point和frame
CGPoint originalCenter = presentedControllerView.center;
CGSize originalSize = presentedControllerView.frame.size;
CGFloat lengthX = fmax(self.startPoint.x, originalSize.width - self.startPoint.x);
CGFloat lengthY = fmax(self.startPoint.y, originalSize.height - self.startPoint.y);
CGFloat offset = sqrt(lengthX * lengthX + lengthY * lengthY) * 2;
CGSize size = CGSizeMake(offset, offset);

//上圖中的大View,先縮小到最小侮腹,再用UIView的動(dòng)畫變大嘲碧,設(shè)置cornerRadius變成圓,然后漏出下面的VC的view
self.bubble = [[UIView alloc] initWithFrame:CGRectMake(0, 0, size.width, size.height)];
self.bubble.layer.cornerRadius = size.height/2.0f;
self.bubble.center = self.startPoint;
self.bubble.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.001, 0.001);
self.bubble.backgroundColor = self.bubbleColor;
[containerView addSubview:self.bubble];

//上層VC的View
presentedControllerView.center = self.startPoint;
presentedControllerView.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.001, 0.001);
presentedControllerView.alpha = 0;
[containerView addSubview:presentedControllerView];

[UIView animateWithDuration:self.duration animations:^{
    self.bubble.transform = CGAffineTransformIdentity;
    presentedControllerView.transform = CGAffineTransformIdentity;
    presentedControllerView.alpha = 1;
    presentedControllerView.center = originalCenter;
    
} completion:^(BOOL finished) {
    [transitionContext completeTransition:finished];
}];

注釋中解釋了動(dòng)畫原因父阻。主要的原理是View的層級(jí)關(guān)系愈涩,通過上層 bubble 這個(gè) View,慢慢變大至非,形成圓擴(kuò)大的動(dòng)畫钠署。但有一個(gè)前提是,下層的 View的背景色和bubble同色荒椭,混合之后谐鼎,才能形成完整的動(dòng)畫,一旦下層 View 有“噪點(diǎn)”趣惠,這個(gè)動(dòng)畫就失效了狸棍。就像上面的gif展示的一樣。

改進(jìn)

既然原代碼是通過上下層 View 來實(shí)現(xiàn)味悄,那讓咱們換個(gè)思路草戈,只需要修改一點(diǎn)點(diǎn)代碼就可以——

iOS不是還有一個(gè)好玩的東西,叫做 maskView 的嗎侍瑟?
CGPoint originalCenter = presentedControllerView.center;
CGSize originalSize = presentedControllerView.frame.size;
CGFloat lengthX = fmax(self.startPoint.x, originalSize.width - self.startPoint.x);
CGFloat lengthY = fmax(self.startPoint.y, originalSize.height - self.startPoint.y);
CGFloat offset = sqrt(lengthX * lengthX + lengthY * lengthY) * 2;
CGSize size = CGSizeMake(offset, offset);

self.bubble = [[UIView alloc] initWithFrame:CGRectMake(0, 0, size.width, size.height)];
self.bubble.backgroundColor = [UIColor redColor];
self.bubble.layer.cornerRadius = size.height/2.0f;
self.bubble.center = self.startPoint;
self.bubble.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.001, 0.001);
//將上層 bubble 當(dāng)做下層 View 的 maskView
containerView.maskView = self.bubble; 

presentedControllerView.center = originalCenter;
[containerView addSubview:presentedControllerView];

[UIView animateWithDuration:self.duration animations:^{
    self.bubble.transform = CGAffineTransformIdentity;
} completion:^(BOOL finished) {
    [transitionContext completeTransition:finished];
}];

Github鏈接:

https://github.com/Balzac646729740/WHBubbleTransition

覺得不錯(cuò)就點(diǎn)個(gè)贊吧????
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末唐片,一起剝皮案震驚了整個(gè)濱河市丙猬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌费韭,老刑警劉巖茧球,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異星持,居然都是意外死亡抢埋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門督暂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來揪垄,“玉大人,你說我怎么就攤上這事逻翁〖⑴” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵八回,是天一觀的道長肪凛。 經(jīng)常有香客問我,道長辽社,這世上最難降的妖魔是什么伟墙? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮滴铅,結(jié)果婚禮上戳葵,老公的妹妹穿的比我還像新娘。我一直安慰自己汉匙,他們只是感情好拱烁,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著噩翠,像睡著了一般戏自。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上伤锚,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天擅笔,我揣著相機(jī)與錄音,去河邊找鬼屯援。 笑死猛们,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的狞洋。 我是一名探鬼主播弯淘,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼吉懊!你這毒婦竟也來了庐橙?” 一聲冷哼從身側(cè)響起假勿,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎态鳖,沒想到半個(gè)月后废登,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡郁惜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了甲锡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兆蕉。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖缤沦,靈堂內(nèi)的尸體忽然破棺而出虎韵,到底是詐尸還是另有隱情,我是刑警寧澤缸废,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布包蓝,位于F島的核電站,受9級(jí)特大地震影響企量,放射性物質(zhì)發(fā)生泄漏测萎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一届巩、第九天 我趴在偏房一處隱蔽的房頂上張望硅瞧。 院中可真熱鬧,春花似錦恕汇、人聲如沸腕唧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽枣接。三九已至,卻和暖如春缺谴,著一層夾襖步出監(jiān)牢的瞬間但惶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來泰國打工湿蛔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留榆骚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓煌集,卻偏偏與公主長得像妓肢,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子苫纤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

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

  • afinalAfinal是一個(gè)android的ioc碉钠,orm框架 https://github.com/yangf...
    passiontim閱讀 15,437評(píng)論 2 45
  • 太長了纲缓,還是轉(zhuǎn)載吧...今天在看博客的時(shí)候,無意中發(fā)現(xiàn)了@Trinea在GitHub上的一個(gè)項(xiàng)目Android開源...
    龐哈哈哈12138閱讀 20,214評(píng)論 3 283
  • 先上一張奕奕自己疊的衣服的圖喊废,爸爸說這是奕奕的房間祝高,奕奕的衣服疊好了可以放在他自己喜歡的地方,然后奕奕小盆友就看好...
    辛馨閱讀 124評(píng)論 0 0
  • 沒有目的污筷,沒有方向工闺,想要一場說走就走的散步。外面的環(huán)境不比屋內(nèi)溫暖瓣蛀,但空氣卻也不比屋內(nèi)厚重陆蟆,也許有些不適這清晨的寒...
    不懂wz閱讀 350評(píng)論 0 0
  • 因?yàn)槲覍?duì)虛擬世界愛的深沉。 并不是我故意甩鍋惋增,這還真不完全是我一個(gè)人的鍋叠殷,有記憶以來就被不斷強(qiáng)化安靜乖巧愛讀書的宅...
    無良印品閱讀 281評(píng)論 0 0