自定義轉(zhuǎn)場(chǎng)動(dòng)畫 push--pop動(dòng)畫

思路:

控制器A 控制器B 中各有一個(gè)圓形按鈕壕吹,點(diǎn)擊A中白色按鈕會(huì)Push到B控制器

自定義動(dòng)畫部分 創(chuàng)建動(dòng)畫類繼承NSObject遵循UIViewControllerAnimatedTransitioning協(xié)議著蛙,實(shí)現(xiàn)以下方法

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext;

- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext;?

計(jì)算小圓和大圓的圓心和半徑耳贬,用CABasicAnimation 繪制路徑動(dòng)添加畫即可

CABasicAnimation *anim = [CABasicAnimation animation];

anim.fromValue = (id)smallPath.CGPath;

anim.toValue = bigPath;

A B控制器都要遵循UINavigationControllerDelegate 代理和實(shí)現(xiàn)以下方法? -(id)navigationController:(UINavigationController*)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController*)fromVC toViewController:(UIViewController*)toVC{



//事例

A B控制器都要遵循UINavigationControllerDelegate 代理和實(shí)現(xiàn)以下方法

- (id)navigationController:(UINavigationController*)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController*)fromVC toViewController:(UIViewController*)toVC{

? ? if (operation == UINavigationControllerOperationPush) {

? ? ? ? TMTransition *trans = [TMTransition new];

? ? ? ? trans.isPush=YES;

? ? ? ? returntrans;

? ? }else{

? ? ? ? returnnil;

? ? }

}


//在此方法中實(shí)現(xiàn)具體的轉(zhuǎn)場(chǎng)動(dòng)畫

- (void)animateTransition:(id)transitionContext{

? ? //1.持有上下文

? ? _context= transitionContext;

? ? //2.獲取一個(gè)view的容器

? ? UIView*containerView = [transitionContextcontainerView];

? ? //3.獲取tovc的view踏堡,然后添加到容器里面

? ? UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];


? ? //4.添加動(dòng)畫

? ? UIButton*btn;

? ? ViewController *VC1;

? ? TMBlueController *VC2;

? ? if(_isPush) {

? ? ? ? VC1 = [transitionContextviewControllerForKey:UITransitionContextFromViewControllerKey];

? ? ? ? VC2 = [transitionContextviewControllerForKey:UITransitionContextToViewControllerKey];

? ? ? ? btn = VC1.mFirstBtn;


? ? }else{

? ? ? ? VC2 = [transitionContextviewControllerForKey:UITransitionContextFromViewControllerKey];

? ? ? ? VC1 = [transitionContextviewControllerForKey:UITransitionContextToViewControllerKey];

? ? ? ? btn = VC2.mBlueBtn;

? ? }

? ? [containerViewaddSubview:VC1.view];

? ? [containerViewaddSubview:VC2.view];

? ? //5.畫一個(gè)小圓(大小圓的中心點(diǎn)是一樣)

? ? UIBezierPath *smallPath = [UIBezierPath bezierPathWithOvalInRect:btn.frame];

? ? //6.中心點(diǎn)

? ? CGPointcenterP;

? ? centerP = btn.center;

? ? //7.求大圓的半徑

? ? CGFloatradius;

? ? //8.判斷按鈕在哪個(gè)象限

? ? CGFloat y = CGRectGetHeight(toVC.view.frame)-btn.center.y;

? ? CGFloat x = CGRectGetWidth(toVC.view.frame) - btn.center.x;

? ? if (btn.frame.origin.x > CGRectGetWidth(toVC.view.frame)/2) {

? ? ? ? if (btn.frame.origin.y < CGRectGetHeight(toVC.view.frame)/2) {

? ? ? ? ? ? //1

? ? ? ? ? ? radius =sqrtf(btn.center.x*btn.center.x+ y*y);

? ? ? ? }else{

? ? ? ? ? ? //4

? ? ? ? ? ? radius =sqrtf(btn.center.x*btn.center.x+ btn.center.y*btn.center.y);

? ? ? ? }

? ? }else{

? ? ? ? if (CGRectGetMaxY(btn.frame) < CGRectGetHeight(toVC.view.frame)/2) {

? ? ? ? ? ? //2

? ? ? ? ? ? radius =sqrtf(x*x + y*y);

? ? ? ? }else{

? ? ? ? ? ? //3

? ? ? ? ? ? radius =sqrtf(btn.center.y*btn.center.y+ x*x);

? ? ? ? }

? ? }

? ? //9.用貝塞爾畫大圓

? ? UIBezierPath *bigPath = [UIBezierPath bezierPathWithArcCenter:centerP radius:radius startAngle:0 endAngle:M_PI*2 clockwise:YES];

? ? //10.把path添加到layer

? ? CAShapeLayer *shapeLayer = [CAShapeLayer layer];

? ? if(_isPush) {

? ? ? ? shapeLayer.path= bigPath.CGPath;

? ? }else{

? ? ? ? shapeLayer.path= smallPath.CGPath;

? ? }

? ? //11.蒙板

? ? UIViewController *VC;

? ? if(_isPush) {

? ? ? ? VC = [transitionContextviewControllerForKey:UITransitionContextToViewControllerKey];

? ? }else{

? ? ? ? VC = [transitionContextviewControllerForKey:UITransitionContextFromViewControllerKey];

? ? }

? ? VC.view.layer.mask= shapeLayer;

? ? //12.動(dòng)畫

? ? CABasicAnimation *anim = [CABasicAnimation animation];

? ? anim.keyPath=@"path";

? ? if(_isPush) {

? ? ? ? anim.fromValue= (id)smallPath.CGPath;

? ? }else{

? ? ? ? anim.fromValue= (id)bigPath.CGPath;

? ? }

? ? //? ? anim.toValue = bigPath;

? ? anim.delegate=self;

? ? [shapeLayeraddAnimation:animforKey:nil];

}

#pragma mark - CAAnimationDelegate

- (void)animationDidStop:(CAAnimation*)anim finished:(BOOL)flag{

? ? [_context completeTransition:YES];

? ? UIViewController *VC;

? ? if(_isPush) {

? ? ? ? VC = [_context viewControllerForKey:UITransitionContextToViewControllerKey];


? ? }else{

? ? ? ? VC = [_context viewControllerForKey:UITransitionContextFromViewControllerKey];


? ? }

? ? VC.view.layer.mask = nil;

}


完整demo:

https://github.com/TeeMoYan/TransitionDemo.git

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市咒劲,隨后出現(xiàn)的幾起案子顷蟆,更是在濱河造成了極大的恐慌,老刑警劉巖腐魂,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帐偎,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蛔屹,警方通過查閱死者的電腦和手機(jī)削樊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)判导,“玉大人嫉父,你說(shuō)我怎么就攤上這事⊙廴校” “怎么了绕辖?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)擂红。 經(jīng)常有香客問我仪际,道長(zhǎng)围小,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任树碱,我火速辦了婚禮肯适,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘成榜。我一直安慰自己框舔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布赎婚。 她就那樣靜靜地躺著刘绣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪挣输。 梳的紋絲不亂的頭發(fā)上纬凤,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音撩嚼,去河邊找鬼停士。 笑死,一個(gè)胖子當(dāng)著我的面吹牛完丽,可吹牛的內(nèi)容都是我干的恋技。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼舰涌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼猖任!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起瓷耙,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤朱躺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后搁痛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體长搀,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年鸡典,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了源请。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡彻况,死狀恐怖谁尸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情纽甘,我是刑警寧澤良蛮,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站悍赢,受9級(jí)特大地震影響决瞳,放射性物質(zhì)發(fā)生泄漏货徙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一皮胡、第九天 我趴在偏房一處隱蔽的房頂上張望痴颊。 院中可真熱鬧,春花似錦屡贺、人聲如沸蠢棱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)裳扯。三九已至,卻和暖如春谤职,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背亿鲜。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工允蜈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蒿柳。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓饶套,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親垒探。 傳聞我的和親對(duì)象是個(gè)殘疾皇子妓蛮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

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