




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
iOS程序員面試分類模擬10簡答題1.
UIView動畫原理是什么?以UIView類的animateWithDuration方法為例?正確答案:iOS4.0以后提供了幾個(gè)基于block塊的動畫方(江南博哥)法(UIView類的+animateWithDuration類方法),替代之前的+beginAnimations:context:和+commitAnimations方法,用于快速實(shí)現(xiàn)一些簡單常用的UI動畫效果。這種方法創(chuàng)建的動畫為隱式動畫,開發(fā)者只需要指定UI元素的一些屬性的目標(biāo)值,即可得到屬性從當(dāng)前值平滑過渡到目標(biāo)值的動畫效果,同時(shí)可以指定動畫的持續(xù)時(shí)間。
可以設(shè)置UI隱式動畫的常用屬性主要有frame、bounds、center、transform、alpha、backgroundColor、contentStretch等。
例如,實(shí)現(xiàn)一個(gè)讓視圖平滑移動到指定位置的動畫代碼如下:
[UIViewanimateWithDuration:0.3animations:^{
/*設(shè)置center目標(biāo)屬性值*/
view.center=CGPointMake(200,200);
}completion:^(BOOLfinished){
/*動畫執(zhí)行結(jié)束回調(diào)*/
}];
動畫持續(xù)時(shí)間為0.3s。在animations代碼塊中定義目標(biāo)屬性值。動畫結(jié)束后會回調(diào)completion代碼塊,可在動畫結(jié)束后繼續(xù)開始新的動畫,實(shí)現(xiàn)簡單的連續(xù)動畫效果。
2.
什么是隱式動畫和顯式動畫?正確答案:隱式動畫是UIKit動畫的基礎(chǔ),是iOS中創(chuàng)建動態(tài)UI界面的最直接的一種方式。開發(fā)者通過直接設(shè)定UI元素的一些可見屬性的目標(biāo)值,如frame、bounds、center、transform、alpha、backgroundColor、contentStretch等,即可自動生成屬性變化的過渡動畫。例如,設(shè)置視圖的目標(biāo)位置為P1,即可自動生成從視圖當(dāng)前位置移動到P1的平滑動畫。隱式動畫是一種默認(rèn)動畫,動畫是線性的,可以滿足基本的需求,但對于一些復(fù)雜的動畫,如讓視圖沿曲線移動,隱式動畫就無能為力了,需要定義顯式動畫來實(shí)現(xiàn)。
例如,假設(shè)視圖view位于屏幕外,通過執(zhí)行下面的隱式動畫,view可以平滑地移入當(dāng)前視圖中央,動畫時(shí)間為0.5s,動畫結(jié)束時(shí)則回調(diào)可以緊接著進(jìn)行其他的操作,如繼續(xù)進(jìn)行下一個(gè)動畫等。
/*隱式動畫,視圖平滑移入當(dāng)前視圖中央*/
[UIViewanimateWithDuration:0.5animations:^{
view.center=self.view.center;
}completion:^(BOOLfinished){
//動畫結(jié)束回調(diào)...
}];
顯式動畫不像隱式動畫那樣默認(rèn)從一個(gè)初始狀態(tài)線性變化到目標(biāo)狀態(tài),而是需要顯式地定義完整的動畫流程,這樣略微復(fù)雜的同時(shí)會更加靈活,可以實(shí)現(xiàn)更加復(fù)雜的動畫效果。例如,隱式動畫只能實(shí)現(xiàn)直線平移效果,而顯式動畫可以顯式地定義任意的曲線路徑,讓視圖沿著曲線移動。簡單來說,顯式動畫就是要顯式地定義動畫對象,設(shè)置動畫對象的各個(gè)狀態(tài)和值,然后將動畫對象應(yīng)用到視圖上,即可呈現(xiàn)動畫的效果。
例如,下面定義一個(gè)在x和y軸方向上(二維平面)不斷縮放的動畫對緣,動畫使視圖層先放大1.2倍,動畫結(jié)束后回到初始狀態(tài),如此循環(huán)。應(yīng)用的時(shí)候?qū)⒃搫赢媽ο筇砑拥綄?yīng)視圖的layer層上即可。
/*定義基本動畫對象(縮放動畫)*/
CABasicAnimation*animation=[CABasicAnimationanimationWithKeyPath:@"transformPath"];
/*設(shè)置動畫目標(biāo)狀態(tài),xy平面放大1.2倍*/
CATransform3DscaleTransform=CATransform3DMakeScale(1.2,1.2,1);
animation.toValue=[NSValuevalueWithCATransform3D:scaleTransform];
/*動畫持續(xù)時(shí)間0.5s*/
animation.duration=0.5;
/*動畫不斷循環(huán)重復(fù)*/
animation.repeatCount=HUGE_VALF;
/*自動逆動畫*/
animation.autoreverses=YES;
/*動畫結(jié)束移除之前動畫對視圖的影響,回到初始狀態(tài)*/
animation.removedOnCompletion=NO;
animation.fillMode=kCAFillModeForwards;
/*應(yīng)用動畫*/
[view.layeraddAnimation:animationforKey:@"animationScaleKey"];
3.
隱式動畫的實(shí)現(xiàn)原理是什么?如何禁用圖層的隱式動畫?正確答案:在iOS程序開發(fā)中,有時(shí)僅僅改變了圖層或者視圖的一個(gè)動畫屬性(例如backgroundColor),就會發(fā)現(xiàn)屬性是平滑地過渡到目標(biāo)值的,屬性值的改變產(chǎn)生了一個(gè)動畫效果,而實(shí)際上開發(fā)者并沒有顯式地使用動畫,這就是隱式動畫的作用。
隱式動畫指當(dāng)更改視圖的非根圖層的可動畫屬性時(shí),CoreAnimation自動決定如何并且何時(shí)去做動畫。動畫的執(zhí)行時(shí)間取決于當(dāng)前事務(wù)(CATransaction),而動畫類型取決于圖層行為。
CATransaction類是用來包含一系列屬性動畫集合的機(jī)制,任何用指定事務(wù)去改變可動畫屬性都不會立即發(fā)生變化,而是當(dāng)事務(wù)提交的時(shí)候開始用一個(gè)動畫過渡到新值。CATransaction類沒有屬性或者實(shí)例方法,也不能用+alloc和-init方法創(chuàng)建,但是可以用+begin和+commit方法分別來入棧和出棧,這類似于UIView的+beginAnimations:context:和+commitAnimations方法。其次,還可以用+setAnimationDuration方法設(shè)置當(dāng)前事務(wù)的動畫時(shí)間,或者+animationDuration方法來獲取值。
改變屬性是CALayer自動應(yīng)用的動畫被稱為“行為”。當(dāng)CALayer的屬性被修改的時(shí)候,它會調(diào)用actionForKey:方法,傳遞屬性的名稱。具體的實(shí)現(xiàn)原理分為以下幾步:
1)圖層會檢測其是否有代理,并且代理是否實(shí)現(xiàn)了CALayerDelegate協(xié)議指定的-actionForLayer:forKey方法。如果有,那么直接調(diào)用并返回結(jié)果。
2)如果圖層沒有代理,或者代理沒有實(shí)現(xiàn)-actionForLayer:forKey:方法,那么圖層會接著檢查包含屬性名稱對應(yīng)行為映射的actions字典。
3)如果actions字典沒有包含對應(yīng)的屬性,那么圖層接著在它的style字典搜索屬性名。
4)最后,如果在style字典中也沒有找到對應(yīng)的行為,那么圖層將會直接調(diào)用定義每個(gè)屬性的標(biāo)準(zhǔn)行為的-defaultActionForKey:方法。
于是就可以解釋UIKit是如何禁用隱式動畫的:每個(gè)UIView都是其根圖層的代理,并且實(shí)現(xiàn)了-actionForLayer:forKey:方法,只不過返回nil,也就是不執(zhí)行任何動畫。
除了在-actionForLayer:forKey:方法的實(shí)現(xiàn)中返回nil外,還可以通過CATransaction的方法+setDisableActions來打開或者關(guān)閉屬性的隱式動畫。使用+setDisableActions臨時(shí)取消隱式動畫的代碼如下:
-(void)viewDidLoad{
[superviewDidLoad];
_colorLayer=[CALayerlayer];
_colorLayer.bounds=CGRectMake(0,0,200,200);
_colorLayer.position=self.view.center;
_colorLayer.baekgroundeolor=[UIColorredColor].CGColor;
_colorLayer.delegate=self;
[self.view.layeraddSublayer:_colorLayer];
}
-(void)touchesBegan:(NSSet<UITouch*>*)toucheswithEvent:(UIEvent*)event{
[CATransactionbegin];
//關(guān)閉隱式動畫
CATransaction.disableActions=YES;
CATransaction.animationDuration=5;
_colorLayer.backgroundColor=randomColor.CGColor;
[CATransactioncommit];
}
4.
CGAffineTransform和CATransform3D分別有什么作用?正確答案:CGAffineTransform被稱為“仿射變換”,它被定義在CoreGraphics框架中,主要用于在二維平面對視圖進(jìn)行旋轉(zhuǎn)、縮放和平移。事實(shí)上,CGAffineTransform是一個(gè)可以和二維空間向量(如CGPoint)做乘法的3×2的矩陣。CGAffineTransform中“仿射”的意思是無論使用什么值的變換矩陣,圖層中平行的兩條線在變換之后仍然會保持平行。
CoreGraphics框架提供了一系列函數(shù)來創(chuàng)建CGAffineTransform實(shí)例,主要有以下幾種:
/*平移*/
CGAffineTransformMakeTranslation(CGFloattx,CGFloatty)
/*縮放*/
GAffineTransformMakeScale(CGFloatsx,CGFloatsy)
/*旋轉(zhuǎn)*/
CGAffineTransformMakeRotation(CGFloatangle)
UIView中的transform屬性或者CALayer中的affineTransform屬性都是CGAffineTransform類型,可以使用它們對視圖或者圖層進(jìn)行仿射變換。此外,CoreGraphics框架還提供了一些可以進(jìn)行混合變換的函數(shù),能夠在一個(gè)變化的基礎(chǔ)上做更深層次的變換,甚至可以將兩個(gè)已經(jīng)存在的變換矩陣進(jìn)行合并。如果要做多次變換的操作,那么這些函數(shù)就會非常有用。下面用例子來演示一個(gè)包含縮放、旋轉(zhuǎn)和移動的變換,示例代碼如下:
-(void)viewDidLoad{
[superviewDidLoad];
_searchImageView=[[UIImageViewalloc]initWithFrame:CGRectMake(([UIScreenmainSereen].bounds.size:width-200)*0.5,([UIScreenmainScreen].bounds.size:height-200)*0.5,200,200)];
_searchImageView.image=[UIImageimageNamed:@"馬"];
[self.viewaddSubview:_searchImageView];
}
-(void)touchesBegan:(NSSet<UITouch*>*)toucheswithEvent:(UIEvent*)event{
/*創(chuàng)建一個(gè)空的CGAffineTransform*/
CGAffineTransformtransform=CGAffineTransformIdentity;
/*縮放*/
transform=CGAffineTransformScale(transform,0.5,0.5);
/*旋轉(zhuǎn)*/
transform=CGAffineTransformRotate(transform,M_PI_4);
/*平移*/
transform=CGAffineTransformTranslate(transform,100,0);
_searchImageView.transform=transform;
}
CATransform3D是CoreAnimation結(jié)構(gòu)體。和CGAffineTransform一樣,它也是一個(gè)矩陣。CATransform3D主要用來做更復(fù)雜的關(guān)于CALayer的3D操作。CoreAnimation提供了一系列方法來創(chuàng)建和組合CATransform3D類型的矩陣,這些函數(shù)和CGAffineTransform類似,只是多了一個(gè)z參數(shù),并且旋轉(zhuǎn)函數(shù)除了angle之外還多出了x、y、z3個(gè)參數(shù),這些參數(shù)分別決定了每個(gè)坐標(biāo)軸方向上的旋轉(zhuǎn)。主要函數(shù)如下:
/*3D平移*/
CATransform3DMakeTranslation(CGFloattx,CGFloatty,CGFloattz)
/*3D旋轉(zhuǎn)*/
CATransform3DMakeRotation(CGFloatangle,CGFloatx,CGFloaty,CGFloatz)
/*3D縮放*/
CATransform3DMakeScale(CGFloatsx,CGFloatsy,CGFloatsz)
此外可以通過CATransform3D中的m34元素來控制3D變換的透視效果。m34元素主要用于按比例縮放X和Y的值來計(jì)算遠(yuǎn)離視角的距離。m34的默認(rèn)值是0,可以通過設(shè)置其為-1/d來應(yīng)用透視效果,d代表了視角和屏幕之間的距離,d的值越小,透視效果越強(qiáng),一般設(shè)置為500~1000。示例代碼如下:
-(void)viewDidLoad{
[superviewDidLoad];
_searchImageView=[UIImageViewalloc]initWithFrame:CGRectMake(([UIScreenmainScreen].bounds.size.width-200)*0.5,([UIScreenmainScreen].bounds.size.height-200)*0.5,200,200)];
_searchImageView.image=[UIImageimageNamed:@"馬"];
[self.viewaddSubview:_searchImageView];
/*創(chuàng)建一個(gè)空的CATransform3D*/
CATransform3Dtransform=CATransform3DIdentity;
/*設(shè)置m34元素,增強(qiáng)透視效果*/
transform.m34=-1.0/500.0;
/*3D旋轉(zhuǎn)變換*/
transform=CATransform3DRotate(transform,M_PI_4,0,1,0):
_searchImageView.layer:transform=transform;
}
5.
CATransition中過渡類型動畫有哪幾種type?正確答案:CATransition是CoreAnimation框架提供的轉(zhuǎn)場動畫類。開發(fā)者可以通過一組預(yù)定義的轉(zhuǎn)換或者定制的CIFilter實(shí)例來指定轉(zhuǎn)場效果。下面的代碼演示了當(dāng)單擊tabBar按鈕時(shí)的界面切換動畫。
-(void)tabBar:(UITabBar*)tabBardidSelectItem:(UITabBarItem*)item{
CATransition*animation=[CATransitionanimation];
animation.duration=0.5:
/*指定效果*/
animation.type=@"reveal";
/*指定效果展示方向*/
animation.subtype=@"fromBottom";
[self.view.layeraddAnimation:animationforKey:nil];
}
其中的type屬性是一個(gè)NSString類型的字符串,指定了轉(zhuǎn)場動畫的類型。它有4個(gè)效果可供選擇:
1)fade:淡入淡出的過渡效果。對應(yīng)常量kCATransitionFade。
2)moveIn:新視圖移動到舊視圖的上面。對應(yīng)常量kCATransitionMoveIn。
3)push:新視圖將舊視圖推出窗口。對應(yīng)常量kCATransitionPush。
4)reveal:舊視圖移開顯示下面的新視圖。對應(yīng)常量kCATransitionReveal。
需要注意的是,以上4種效果都暴露在CATransition的.h頭文件中,可以安全使用。除此之外,還有一些效果屬于iOS私有的API,在使用這些效果后,應(yīng)用在審核時(shí)有一定被拒絕的風(fēng)險(xiǎn)。這些效果包括:
1)cube:立方體效果。
2)oglFlip:翻轉(zhuǎn)效果。
3)suckEffect:收縮效果。
4)rippleEffect:水滴波紋效果。
5)pageCurl:向上翻頁效果。
6)pageUnCurl:向下翻頁效果。
7)cameraIrisHollowOpen:攝像頭打開效果。
8)cameraIrisHollowClose:攝像頭關(guān)閉效果。
6.
如何使用UIView動畫自定義過渡動畫?正確答案:CATransition雖然是一種對那些不太好做平滑動畫屬性的強(qiáng)大工具,但是它的缺點(diǎn)也很明顯,那就是提供的動畫類型太少了。除此之外還可以使用UIView提供的過渡動畫API。
+(void)transitionWithView:duration:optiotis:animations:completion:;
+(void)transitionFromView:toView:duration:options:completion:;
和CATransition一樣,UIView提供的過渡動畫類型仍然很少,其中options參數(shù)可以指定如下常量。
typedefNS_ENUM(NSInteger,UIViewAnimationTransition){
UIViewAnimationTransitionNone,
UIViewAnimationTransitionFlipFromLett,
UIViewAnimationTransitionFlipFromRight,
UIViewAnimationTransitionCurlUp,
UIViewAnimationTransitionCurlDown,
};
在實(shí)際開發(fā)中,有時(shí)CATransition和UIView提供的過渡效果并不能滿足項(xiàng)目需求,這時(shí)就必須考慮實(shí)現(xiàn)自定義的過渡動畫了。
過渡動畫的基礎(chǔ)原則就是對原始圖層外觀截圖,然后添加一段動畫,平滑過渡到圖層改變之后那個(gè)截圖的效果。CALayer的renderInContext:方法可以將當(dāng)前圖層內(nèi)容繪制成圖片,然后在視圖中顯示出來。如果將這個(gè)截屏視圖置于原始視圖之上,那么就可以遮住真實(shí)視圖的所有變化,于是就能通過簡單的UIView動畫API創(chuàng)建過渡效果。對當(dāng)前視圖狀態(tài)截圖,然后在改變背景圖片的時(shí)候?qū)貓D快速轉(zhuǎn)動并且淡出,示例代碼如下:
-(void)startCustomTransitionAnimation{
/*獲取截圖*/
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size,YES,0);
[self.view.layerrenderInContext:UIGraphicsGetCurrentContext()];
UIImage*coverImage=UIGraphicsGetImageFromCurrentImageContext();
/*將截圖添加到主視圖*/
UIImageView*coverImageView=[[UIImageViewalloc]initWithImage:coverImage];
coverImageView.frame=self.view.bounds;
[self.viewaddSubview:coverImageView];
/*更換背景圖片*/
self.view.layer.contents=(id)[UIImageimageNamed:@"2"].CGImage;
/*添加動畫*/
[UIViewanimateWithDuration:1animations:^{
CGAffineTransformtransform=CGAffineTransformMakeScale(0.01,0.01);
transform=CGAffineTransformRotate(transfoma,M_PI_2);
coverImageView.alpha=0;
coverImageView.transform=transform;
}completion:^(BOOLfinished){
[coverImageViewremoveFromSuperview];
}];
}
效果如圖所示。
動畫過渡效果
7.
如何理解并使用CAKeyframeAnimation?正確答案:CAKeyframeAnimation即關(guān)鍵幀動畫,它是CAPropertyAnimation的一個(gè)子類,它作用于單一的屬性,但和CABasicAnimation不一樣的是,它不需要設(shè)置一個(gè)起始和結(jié)束的值,而是可以根據(jù)開發(fā)者提供的一連串隨意的值來做動畫。這些值就是關(guān)鍵幀,每幀之間的繪制將由系統(tǒng)自動完成。示例代碼如下:
-(void)startKeyframeAnimation{
CAKeyframeAnimation*animation=[CAKeyframeAnimationanimation];
/*指定需要做動畫的屬性*/
animation.keyPath=@"backgroundColor";
/*指定關(guān)鍵幀*/
animation.values=@[(id)[UIColorwhiteColor].CGColor,(id)[taColorreaColor].CGColor,(id)(id)[UIColorblueColor].CGColor,(id)[UIColorblackColor].CGColor,(id)[UIColorwhiteColor].CGColor];
/*指定關(guān)鍵幀的過渡時(shí)間*/
animation.keyTimes=@[@0,@0.2,@0.5,@0.7,@1];
animation.duration=5;
/*指定關(guān)鍵幀的過渡緩沖方式*/
animation.timingFunctions=@[[CAMediaTimingFunctionfunctionWithName:kCAMediaTimingFunctionEaseInEaseOut],[CAMediaTimingFunctionfunctionWithName:kCAMediaTimingFunetionEaseInEaseOut],[CAMediaTimingFunctionfunctionWithName:kCAMediaTimingFunctionEaseInEaseOut],[CAMediaTimingFunctionfunctionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[self.view.layeraddAnimation:animationforKey:nil];
}
使用關(guān)鍵幀動畫需要注意下面3點(diǎn):
1)注意到values數(shù)組中開始和結(jié)束的顏色都是白色,這是因?yàn)殛P(guān)鍵幀動畫并不能將當(dāng)前值作為第一幀。動畫在執(zhí)行后會立即跳轉(zhuǎn)到第一幀的值,然后在動畫結(jié)束的時(shí)候突然恢復(fù)到原始值。所以為了使動畫更加平滑自然,需要使用開始和結(jié)束的關(guān)鍵幀來匹配當(dāng)前屬性的值。
2)除了使用values來指定關(guān)鍵幀以外,還可以使用其path屬性。它是CGPath類型,它可以用一種非常直觀的方式來定義動畫的運(yùn)動序列。在做一些基于位置改變的動畫時(shí),它非常有用。
@property(nullable)CGPathRefpath;
3)指定要做動畫的屬性并非只能是可動畫屬性(animatable),可以對子屬性甚至是虛擬屬性(不能直接使用)做動畫。例如,指定keyPath為transform.rotaion來做旋轉(zhuǎn)動畫。
8.
如何自定義UIViewController之間的轉(zhuǎn)場動畫?正確答案:在實(shí)際開發(fā)中,程序界面常常需要在不同的控制器視圖之間切換,常用的跳轉(zhuǎn)方式有push、pop、present和dismiss等。如果使用這些方式,那么系統(tǒng)會提供默認(rèn)的動畫效果,例如當(dāng)使用-pushViewController:animation:的時(shí)候會產(chǎn)生一個(gè)新視圖從右往左推開舊視圖的動畫效果。但是有時(shí)候希望跳轉(zhuǎn)方式能以其他的動畫效果展示,這時(shí)就需要自定義轉(zhuǎn)場動畫。
在開始自定義轉(zhuǎn)場動畫之前,有必要先了解幾個(gè)簡單的概念。
1)fromView和toView,在很多API中常常會有fromView和toView,ffomView表示當(dāng)前視圖,即跳轉(zhuǎn)前的視圖,而toView代表跳轉(zhuǎn)后的視圖(或稱為跳轉(zhuǎn)的目標(biāo)視圖)。
2)presentedViewController和presentingViewController,這也是一組相對的概念,presentedViewController表示被modal出的視圖控制器(或稱為跳轉(zhuǎn)的目標(biāo)視圖控制器),而presentingViewController代表源視圖控制器。
3)UIViewControllerTransitioningDelegate協(xié)議用于為跳轉(zhuǎn)動畫提供實(shí)現(xiàn)了UIViewControllerAnimatedTransitioning協(xié)議的對象。
4)UIViewControllerAnimatedTransitioning協(xié)議主要用于控制動畫的展示時(shí)間和動畫展示邏輯。
5)UIViewControllerInteractiveTransitioning協(xié)議即交互式轉(zhuǎn)場動畫代理,這個(gè)協(xié)議主要用于交互式動畫。
6)UIViewControllerContextTransitioning協(xié)議即轉(zhuǎn)場動畫上下文協(xié)議,它的作用在于為動畫提供必備的信息。開發(fā)者不應(yīng)該緩存任何關(guān)于動畫的信息,而是應(yīng)該從轉(zhuǎn)場動畫上下文中獲取,這樣可以保證總是獲取到最新的、正確的信息。
要實(shí)現(xiàn)整個(gè)轉(zhuǎn)場動畫邏輯需要兩組必需的元素,其一是代表頁面跳轉(zhuǎn)關(guān)系的兩個(gè)控制器對象,其二是動畫執(zhí)行邏輯。以下是實(shí)現(xiàn)動畫的步驟:
1)為源控制器和目標(biāo)控制器分別設(shè)置一個(gè)遵守UIViewControllerAnimatedTransitioning協(xié)議的代理對象。當(dāng)然也可以設(shè)置為同一個(gè)對象。
2)調(diào)用對應(yīng)的跳轉(zhuǎn)方法。此時(shí)系統(tǒng)會自動請求動畫代理提供動畫邏輯對象。
下面的例子展示了一個(gè)自定義的跳轉(zhuǎn)動畫效果。
/*設(shè)置transitioningDelegate為當(dāng)前控制器*/
-(void)startCustomControllerTransitionAniamtion1:(UITouch*)touch{
_touchPoint=[touchlocationInView:self.view];
TouchExampleController*VC=[TouchExampleControllernew];
vc.type=3;
vc.transitioningDelegate=self;
[selfpresentViewController:vcanimated:YEScompletion:nil];
}
/*當(dāng)modal時(shí),系統(tǒng)會自動調(diào)用此方法返回一個(gè)遵守UIViewControllerAnimatedTransitioning協(xié)議的對象*/
-(nullableid<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController*)presentedpresentingController:(UIViewController*)presentingsourceController:(UIViewController*)source{
TransitionAnimator*animator=[TransitionAnimatornew];
/*將單擊坐標(biāo)傳過去,以確定動畫開始的點(diǎn)*/
animator.touchPoint=_touchPoint;
returnanimator:
}
/*在TransitionAnimator類實(shí)現(xiàn)中,實(shí)現(xiàn)UIViewControllerAnimatedTransitioning協(xié)議*/
@implementationTransitionAnimator
/*設(shè)置動畫時(shí)長*/
-(NSTimeInterval)transitionDuration:(nullableid<UIViewControllerContextTransitioning>)transitionContext{
return1;
}
/*設(shè)置動畫*/
-(void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext{
/*從上下文中獲取必需信息*/
UIView*fromV=[transitionContextViewForKey:
UITransitionContextFromViewKey];
UIView*toV=[transitionContextviewForKey:UITransitionContextToViewKey];
UIView*containerView=[transitionContextcontainerView];
/*將視圖添加到containerView中*/
[containerViewaddSubview:fromV];
[containerViewaddSubview:toV];
CGFloatscreenWidth=[UIScreenmainScreen].bounds.size.width;
CGFloatscreenHeight=[UIScreenmainScreen].bounds.size.height;
CGPointtempPoint=[containerViewconvertPoint:self.touchPointfromView:[transitionContextviewForKey:UITransitionContextFromViewKey]];
CGRectrect=CGRectMake(tempPoint.x-1,tempPoint.y-1,2,2);
/*使用UIBerizerPath繪制動畫的開始路徑和結(jié)束路徑*/
UIBezierPath*startPath=[UIBezierPathbezierPathWithOvalInRect:reet];
UIBezierPath*endPath=[UIBezierPathbezierPathWithArcCenter:containerView.centerradius:sqrt(screenHeight*screenHeight+screenWidth*screenWidth)startAngle:0endAngle:M_PI*2clockwise:YES];
/*設(shè)置maskLayer*/
CAShapeLayer*maskLayer=[CAShapeLayerlayer];
maskLayer.path=endPath.CGPath;
toV.layer.mask=maskLayer;
/*設(shè)置動畫*/
CABasicAnimation*animation=[CABasicAnimationanimationWithKeyPath:@"path"];
animation.delegate=self;
animation.fromValue=(id)startPath.CGPath;
animation.toValue=(id)endPath.CGPath;
anim
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 旅游行業(yè)行程變動及責(zé)任豁免協(xié)議書
- 電子支付平臺開發(fā)與推廣合作協(xié)議
- 營業(yè)辦公用房買賣協(xié)議書
- 中學(xué)生感恩教育故事觀后感
- 高考語文高頻文言實(shí)詞60詞表解
- 環(huán)保能源行業(yè)項(xiàng)目合作風(fēng)險(xiǎn)提示
- 高考語文備考之明朝作家文言文匯編(下)
- 購銷家具合同家具購銷合同
- 綠色農(nóng)業(yè)種植合同
- 裝修工程勞務(wù)外包合同
- 《紅巖》中考試題(截至2024年)
- 2025年黑龍江旅游職業(yè)技術(shù)學(xué)院單招職業(yè)傾向性測試題庫匯編
- 2025年湖南城建職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫新版
- 國家基本藥物臨床應(yīng)用指南
- 企業(yè)級軟件開發(fā)作業(yè)指導(dǎo)書
- 護(hù)士法律法規(guī)知識培訓(xùn)
- 《中國古代文學(xué)史及作品選II》教學(xué)大綱
- 代工生產(chǎn)合同范本
- 人教版英語2025七年級下冊 Unit1Animal Friends教師版 語法講解+練習(xí)
- DeepSeek新手入門教程
- 課件:《教育強(qiáng)國建設(shè)規(guī)劃綱要(2024-2035年)》學(xué)習(xí)宣講
評論
0/150
提交評論