Swift中的自定義轉(zhuǎn)場(chǎng)動(dòng)畫

在實(shí)際開發(fā)中經(jīng)常會(huì)出現(xiàn)的效果圖 :?

如何實(shí)現(xiàn)這種效果呢?

下面直接上代碼

```objc?

//設(shè)置轉(zhuǎn)場(chǎng)動(dòng)畫的代理

menu.transitioningDelegate=delegateOftransition

//設(shè)置轉(zhuǎn)場(chǎng)動(dòng)畫的樣式為自定義

menu.modalPresentationStyle=UIModalPresentationStyle.Custom

//執(zhí)行modal動(dòng)畫

self.presentViewController(menu, animated:true, completion:nil)

```

當(dāng)然,成為了代理還要實(shí)現(xiàn)代理方法,下面就是代理里面的代碼

```objc

extensiontransitionDelegate:UIViewControllerTransitioningDelegate{

//此方法返回一個(gè)用于負(fù)責(zé)轉(zhuǎn)場(chǎng)動(dòng)畫的對(duì)象

funcpresentationControllerForPresentedViewController(presented:UIViewController, presentingViewController presenting:UIViewController, sourceViewController source:UIViewController) ->UIPresentationController?

{

letpresentation =WLCPresentation(presentedViewController: presented, presentingViewController:presenting)

presentation.showViewFrame=menuFrame

returnpresentation

}

//返回一個(gè)控制出現(xiàn)轉(zhuǎn)場(chǎng)動(dòng)畫的對(duì)象

funcanimationControllerForPresentedController(presented:UIViewController, presentingController presenting:UIViewController, sourceController source:UIViewController) ->UIViewControllerAnimatedTransitioning?

{

isPresent=true//菜單要顯示,賦值為true

returnself

}

//返回一個(gè)控制消失轉(zhuǎn)場(chǎng)動(dòng)畫的對(duì)象

funcanimationControllerForDismissedController(dismissed:UIViewController) ->UIViewControllerAnimatedTransitioning?

{

isPresent=false//菜單要消失,賦值為false

returnself

}

```

注意第一個(gè)函數(shù)返回的對(duì)象,這個(gè)對(duì)象是需要自定義的,并且繼承于UIPresentationController,這樣就可以在這個(gè)對(duì)象里面實(shí)現(xiàn)控制彈出的控制器的view的大小了,下面就是自定義的對(duì)象中的代碼了

```objc

overridefunccontainerViewWillLayoutSubviews() {

//設(shè)置彈出視圖的尺寸

presentedView()?.frame.size = CGSize(width: 200, height: 200)

presentedView()?.center.x = UIScreen.mainScreen().bounds.size.width * 0.5

presentedView()?.frame.origin.y = 50

//添加返回蒙板按鈕

//containerView非常重要,容器視圖,所有modal出來的視圖都是添加到containerView上面的

containerView?.insertSubview(bgBtn, atIndex:0)

bgBtn.addTarget(self, action:Selector("dismissClick"), forControlEvents:UIControlEvents.TouchUpInside)

}

lazyvarbgBtn :UIButton= {

letbgBtn =UIButton()

bgBtn.frame=UIScreen.mainScreen().bounds

bgBtn.backgroundColor=UIColor.clearColor()

returnbgBtn

}()

funcdismissClick(){

//presentedViewController非常重要,已經(jīng)modal出來的控制器

presentedViewController.dismissViewControllerAnimated(true, completion:nil)

}

}

```

我還在modal出來的控制器上加了一個(gè)等于屏幕尺寸的按鈕,這樣只要點(diǎn)擊view以外任何一個(gè)地方就可以dismiss掉這個(gè)控制器蜒犯。

現(xiàn)在繼續(xù)回到delegateOftransition這個(gè)代理中,可以看到它還實(shí)現(xiàn)了另外兩個(gè)代理方法,返回對(duì)象均為其本身,這意味著它還要遵守UIViewControllerAnimatedTransitioning這個(gè)協(xié)議,然后實(shí)現(xiàn)協(xié)議中的方法,下面是代碼

```objc

extensiontransitionDelegate:UIViewControllerAnimatedTransitioning

{

//用于控制動(dòng)畫的時(shí)長(zhǎng)

functransitionDuration(transitionContext:UIViewControllerContextTransitioning?) ->NSTimeInterval

{

return 1.0;

}

//專門用于管理modal如何展現(xiàn)和消失的,無(wú)論是展現(xiàn)還是消失都會(huì)調(diào)用該方法

/*

注意點(diǎn):只要我們實(shí)現(xiàn)了這個(gè)方法,那么系統(tǒng)就不會(huì)再有默認(rèn)的動(dòng)畫了

也就是說默認(rèn)的modal動(dòng)畫不會(huì)再幫我們添加了,所有的動(dòng)畫操作都要我們自己實(shí)現(xiàn),包括需要展現(xiàn)的視圖也要手動(dòng)進(jìn)行添加到容器視圖(containerView)上了

*/

funcanimateTransition(transitionContext:UIViewControllerContextTransitioning)

{

ifisPresent{

presentMenu(transitionContext)

}else{

dismissMenu(transitionContext)

}

}

/**

展現(xiàn)菜單函數(shù)

*/

funcpresentMenu(transitionContext:UIViewControllerContextTransitioning){

//按鈕是選中狀態(tài),需要顯示菜單

//1.拿到需要添加的視圖

lettoView = transitionContext.viewForKey(UITransitionContextToViewKey)

//2.將需要添加的視圖添加到容器視圖(containerView)上

transitionContext.containerView()?.addSubview(toView!)

//3.設(shè)置動(dòng)畫

toView?.transform=CGAffineTransformMakeScale(1.0,0.0)

toView?.layer.anchorPoint=CGPointMake(0.5,0)

UIView.animateWithDuration(transitionDuration(transitionContext), animations: { () ->Voidin

toView?.transform=CGAffineTransformIdentity

}) { (_) ->Voidin

//注意:自定義的轉(zhuǎn)場(chǎng)動(dòng)畫,在動(dòng)畫執(zhí)行完畢后一定要告訴系統(tǒng)動(dòng)畫執(zhí)行完畢

transitionContext.completeTransition(true)

}

}

/**

*隱藏菜單函數(shù)

*/

funcdismissMenu(transitionContext:UIViewControllerContextTransitioning){

//1.拿到需要隱藏的視圖

letfromView = transitionContext.viewForKey(UITransitionContextFromViewKey)

//2.執(zhí)行隱藏的動(dòng)畫

UIView.animateWithDuration(transitionDuration(transitionContext), animations: { () ->Voidin

fromView?.transform=CGAffineTransformMakeScale(1.0,0.00001)

}, completion: { (_) ->Voidin

//注意:自定義的轉(zhuǎn)場(chǎng)動(dòng)畫,在動(dòng)畫執(zhí)行完畢后一定要告訴系統(tǒng)動(dòng)畫執(zhí)行完畢

transitionContext.completeTransition(true)

})

}

```

總結(jié)一下,具體實(shí)現(xiàn)步驟就是設(shè)置轉(zhuǎn)場(chǎng)動(dòng)畫的代理,然后在實(shí)現(xiàn)代理方法中,需要自定義一個(gè)繼承自UIPresentationController的類,這個(gè)類里面可以控制modal出來的控制器的尺寸和布局子控件等,最后在轉(zhuǎn)場(chǎng)動(dòng)畫的代理中可以設(shè)置動(dòng)畫的樣式逻淌。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市羔味,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蛆橡,老刑警劉巖舌界,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異泰演,居然都是意外死亡呻拌,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門睦焕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來藐握,“玉大人,你說我怎么就攤上這事垃喊』眨” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵本谜,是天一觀的道長(zhǎng)初家。 經(jīng)常有香客問我,道長(zhǎng)乌助,這世上最難降的妖魔是什么溜在? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮眷茁,結(jié)果婚禮上炕泳,老公的妹妹穿的比我還像新娘。我一直安慰自己上祈,他們只是感情好培遵,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著登刺,像睡著了一般籽腕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纸俭,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天皇耗,我揣著相機(jī)與錄音,去河邊找鬼揍很。 笑死郎楼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的窒悔。 我是一名探鬼主播呜袁,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼简珠!你這毒婦竟也來了阶界?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎膘融,沒想到半個(gè)月后芙粱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡氧映,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年春畔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屯耸。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拐迁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出疗绣,到底是詐尸還是另有隱情线召,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布多矮,位于F島的核電站缓淹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏塔逃。R本人自食惡果不足惜讯壶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望湾盗。 院中可真熱鬧伏蚊,春花似錦、人聲如沸格粪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)帐萎。三九已至比伏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間疆导,已是汗流浹背赁项。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留澈段,地道東北人悠菜。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像败富,于是被迫代替她去往敵國(guó)和親悔醋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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