OC_轉場動畫的工具類(無交互)

轉場動畫的學習

請看簡書iOS CAAnimation之CATransition(自定義轉場動畫)

一、思路

. a跳轉b

a: a可以什么都不用做,直接present,

b: b要在init方法里面 寫這兩個方法,

這個方法保證fromView才不會被移除(及可以在modal后看到a控制器的view)

self.modalPresentationStyle = UIModalPresentationCustom;

這個屬性表示在modal、dismiss的時候會走自定義的方法

self.transitioningDelegate = self.animatr;

二、Animatr 方法 && 屬性

1. 構造方法

.*這里需要注意,要給定modalPresentationStyle,否則會有坑:請看后面的"坑1"

/** * modalPresentationStyle toVC中設置的轉場動畫的樣式 */+(instancetype)animatrWithModalPresentationStyle: (UIModalPresentationStyle)modalPresentationStyle;/** * modalPresentationStyle toVC中設置的轉場動畫的樣式 */-(instancetype)initWithModalPresentationStyle: (UIModalPresentationStyle)modalPresentationStyle;

.*dismiss & present 動畫具體回調方法

//MARK: ---------------------- dismiss & present ------------------------/**dismiss動畫*/-(void)dismissAnimaWithBlock: (void(^)(UIViewController*toVC,UIViewController*fromeVC,UIView*toView,UIView*fromeView))dismissAnimaBlock;/**present動畫*/-(void)presentAnimaWithBlock: (void(^)(UIViewController*toVC,UIViewController*fromeVC,UIView*toView,UIView*fromeView))presentAnimaBlock;

.*容器視圖的view,可以用作遮罩,修改ContainerView的方法

//MARK: ---------------------- setupContainerView -------------------------(void)setupContainerViewWithBlock: (void(^)(UIView *containerView))setupContainerViewBlock;

2. 屬性

/**這是屬性一定要設置,否則看 上面解釋的“坑1”*/@property(nonatomic,assign)UIModalPresentationStylemodalPresentationStyle;//MARK:? -------------------- 動畫時長 和類型 ------------------------/** present動畫時長*/@property(nonatomic,assign)CGFloatpresentDuration;/** dismiss動畫時長*/@property(nonatomic,assign)CGFloatdismissDuration;/**動畫是否完成,在動畫完成時候,一定要把這個屬性改為YES*/@property(nonatomic,assign)BOOLisAccomplishAnima;

三、具體實現

注意: 一切都在toVC中設置

設置屬性(類延展中相對私有屬性)

@interfacePushViewController ()@property(nonatomic,strong) Animatr *animatr;@end

在懶加載中或者viewDidLoad中設置相關屬性和實現相關方法

-(void)viewDidLoad { [superviewDidLoad];self.view.backgroundColor = [UIColorblueColor]; [selfsetupAnimatr];//設置Animatr}//設置Animatr-(void)setupAnimatr {//dismiss動畫預估時長_animatr.dismissDuration =4;//present動畫預估時長_animatr.presentDuration =5;//dismiss轉場動畫[_animatr dismissAnimaWithBlock:^(UIViewController*toVC,UIViewController*fromeVC,UIView*toView,UIView*fromeView) {NSLog(@"dismiss開始");? ? [UIViewanimateWithDuration:_animatr.dismissDuration animations:^{? ? ? ? fromeView.frame =CGRectMake(0,0,100,100);? ? } completion:^(BOOLfinished) {//在完成動畫的時候一定要把這個屬性設置成YES 告訴系統動畫完成_animatr.isAccomplishAnima =YES;? ? }]; }];//present轉場動畫[_animatr presentAnimaWithBlock:^(UIViewController*toVC,UIViewController*fromeVC,UIView*toView,UIView*fromeView) {? ? [UIViewanimateWithDuration:_animatr.presentDuration animations:^{? ? ? ? toView.frame =CGRectMake(0,300,300,300);? ? } completion:^(BOOLfinished) {//在完成動畫的時候一定要把這個屬性設置成YES 告訴系統動畫完成_animatr.isAccomplishAnima =YES;? ? }]; }];//容器視圖,裝有toView和fromeView,可以作為遮罩[_animatr setupContainerViewWithBlock:^(UIView*containerView) {? ? containerView.backgroundColor = [UIColorcolorWithWhite:0.8alpha:0.8]; }];}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容