欢迎来真孝善网,为您提供真孝善正能量书籍故事!

创新Modal动画效果制作指南

时间:11-22 名人轶事 提交错误

很多朋友对于创新Modal动画效果制作指南和不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!

一、效果图:如果喜欢gitHub地址,请给个star吧~

1.gif

自定义转场需要用到什么东西?

1. UIViewControllerAnimatedTransitioning 是一个协议。这个接口负责切换的具体内容,即“切换过程中应该发生什么”。动画实现只需要实现它的两个代理方法即可。

2. UIViewControllerTransitioningDelegate是一个协议。当需要VC切换时,系统会询问实现该接口的对象是否需要使用自定义切换效果,即选择自定义动画。

3、UIPresentationController类控制控制器跳转。它是iOS8中新增的API,用于控制控制器之间的跳转效果。例如:显示一个模态窗口,大小和位置自定义,遮罩在原始页面上。参考

4.modalPresentationStyle 这是UIViewController的一个属性,字面意思就是模态样式。如果要自定义,需要将其设置为自定义。

5.TransitioningDelegate是UIViewControllerTransitioningDelegate协议的代理方法的实现者。它通常由一个特殊的班级管理。看完你就知道了~

一步一个脚印,代码实现来了,具体分析代码中有注释~

1.首先新建一个继承NSObject的动画管理类FLTransitionAnimation。管理是执行呈现和消失动画。在m文件的扩展中,遵守UIViewControllerAnimatedTransitioning协议,实现两个代理methods.h文件:

* * * * * * * * * * * * * * * * * * * * * * * * * *

#import//呈现或忽略

typedef 枚举{

FLTransitionAnimationTypePresent,

FLTransitionAnimationTypeDismiss

}FLTransitionAnimationType;

//当前方向

typedef 枚举{

FLPresentDirectionTypeFromLeft,

FLPresentDirectionTypeFromRight

}FLPresentDirectionType;

//当前方向

typedef 枚举{

FLDismissDirectionTypeFromLeft,

FLDismissDirectionTypeFromRight

}FLDismissDirectionType;

@interface FLTransitionAnimation : NSObject

/**

* @作者孔繁烈, 16-09-02 02:09:13

*

* 出席或解散

*/

@property(非原子,分配)FLTransitionAnimationType fl_transitionAnimationType;

/**

* @作者孔繁烈, 16-09-02 04:09:56

*

* 目前方向

*/

@property(非原子,分配)FLPresentDirectionType fl_presentDirectionType;

/**

* @作者孔繁烈, 16-09-02 04:09:05

*

*取消方向

*/

@property(非原子,分配)FLDismissDirectionType fl_dismissDirectionType;

@end.m 文件:

* * * * * * * * * * * * * * * * * * * * * * * * * *

#import "FLTransitionAnimation.h"

@导入UIKit;

@interface FLTransitionAnimation ()@end

@实现FLTransitionAnimation

//动画执行时间

静态常量CGFloat 持续时间=0.3;

/**

* @作者孔繁烈, 16-09-02 04:09:30

*

* 返回动画执行时间

*

* @param transitionContext 实现动画效果时,可以通过参数transitionContext获取切换时的上下文信息,比如从哪个VC切换到哪个VC等。

*

* @return 返回值说明

*/

- (NSTimeInterval)transitionDuration:(id)transitionContext{

返回持续时间;

}

/**

* @作者孔繁烈, 16-09-02 04:09:25

*

* 执行特定的动画

*

* @paramtransitionContext上下文信息

*/

- (void)animateTransition:(id)transitionContext{

if (self.fl_transitionAnimationType==FLTransitionAnimationTypePresent) {

//1.获取视图

UIView *toView=[transitionContext viewForKey:UITransitionContextToViewKey];

//2.改变框架

__block CGRect tempFrame=toView.frame;

if (self.fl_presentDirectionType==FLPresentDirectionTypeFromRight) {

tempFrame.origin.x=toView.frame.size.width;

}

else if (self.fl_presentDirectionType==FLPresentDirectionTypeFromLeft) {

tempFrame.origin.x=-toView.frame.size.width;

}

toView.frame=tempFrame;

//3.开始动画

[UIView animateWithDuration:duration 动画:^{

tempFrame.origin.x=0;

toView.frame=tempFrame;

} 完成:^(BOOL 完成) {

//4.告诉上下文我们完成了

[transitionContextcompleteTransition:YES];

}];

}

否则如果(self.fl_transitionAnimationType==FLTransitionAnimationTypeDismiss){

//1.获取视图

UIView *fromView=[transitionContext viewForKey:UITransitionContextFromViewKey];

//2.改变框架

__block CGRect tempFrame=fromView.frame;

//3.开始动画

[UIView animateWithDuration:duration 动画:^{

if (self.fl_dismissDirectionType==FLDismissDirectionTypeFromRight) {

tempFrame.origin.x=-fromView.frame.size.width;

}

否则if (self.fl_dismissDirectionType==FLDismissDirectionTypeFromLeft) {

tempFrame.origin.x=fromView.frame.size.width;

}

fromView.frame=tempFrame;

} 完成:^(BOOL 完成) {

//4.告诉上下文我们完成了

[transitionContextcompleteTransition:YES];

}];

}

}

@结束2。上面提到,实现UIViewControllerTransitioningDelegate的代理方法一般都是由类来实现和管理的。 FLTransitionManager是专门为了实现该协议的代理方法而设计的。比如用什么动画来执行present或dismiss,这是在m文件中遵循UIViewControllerTransitioningDelegate协议并实现其代理方法,告诉它present和dismiss需要哪个动画实例.h文件

* * * * * * * * * * * * * * * * * * * * * * * * * *

#导入@导入UIKit;

//当前方向

typedef 枚举{

FLPresentTypeFromLeft,

FLPresentTypeFromRight

}FLPresentType;

//当前方向

typedef 枚举{

FLDismissTypeFromLeft,

FLDismissTypeFromRight

}FLDismissType;

@interface FLTransitionManager : NSObject/**

* @作者孔繁烈, 16-09-02 04:09:56

*

* 目前方向

*/

@property(非原子,分配)FLPresentType fl_presentType;

/**

* @作者孔繁烈, 16-09-02 04:09:05

*

*取消方向

*/

@property(非原子,分配)FLDismissType fl_dismissType;

//创建单例实例

+ (实例类型)shareManager;

@end.m 文件

* * * * * * * * * * * * * * * * * * * * * * * * * *

#import "FLTransitionManager.h"

//具体动画示例

#import "FLTransitionAnimation.h"

@接口FLTransitionManager()

@结尾

@实现FLTransitionManager

静态FLTransitionManager *_instance=nil;

+ (实例类型)shareManager{

如果(!_实例){

静态dispatch_once_t OnceToken;

dispatch_once(onceToken, ^{

_instance=[[自我分配]初始化];

//设置默认值

_instance.fl_presentType=FLPresentTypeFromRight;

_instance.fl_dismissType=FLDismissTypeFromLeft;

});

}

返回_实例;

}

/**

* @作者孔繁烈, 16-09-02 05:09:10

*

* 当前通话

*

* @parampresented 正在呈现的控制器

* @param 呈现正在呈现的控制器

* @param source 调用了presentViewController:animated:completion:方法的视图控制器。是调用present的控制器

*

* @return 返回一个动画实例

*/

- (id )animationControllerForPresentedController:(UIViewController *)呈现presentingController:(UIViewController *)呈现sourceController:(UIViewController *)源{

FLTransitionAnimation *presentA=[[FLTransitionAnimation alloc] init];

presentA.fl_transitionAnimationType=FLTransitionAnimationTypePresent;

if (self.fl_presentType==FLPresentTypeFromLeft) {

presentA.fl_presentDirectionType=FLPresentDirectionTypeFromLeft;

}

别的{

presentA.fl_presentDirectionType=FLPresentDirectionTypeFromRight;

}

返回礼物A;

}

/**

* @作者孔繁烈, 16-09-02 05:09:20

*

* 驳回来电

*

* @param解雇要解雇的控制器

*

* @return 返回一个动画实例

*/

- (id )animationControllerForDismissedController:(UIViewController *)解雇{

FLTransitionAnimation *dismissA=[[FLTransitionAnimation alloc] init];

missA.fl_transitionAnimationType=FLTransitionAnimationTypeDismiss;

if (self.fl_dismissType==FLDismissTypeFromLeft) {

missA.fl_dismissDirectionType=FLDismissDirectionTypeFromLeft;

}

否则如果(self.fl_dismissType==FLDismissTypeFromRight){

missA.fl_dismissDirectionType=FLDismissDirectionTypeFromRight;

}

返回解雇A;

}

@end3。此时将modalPresentationStyle设置为Custom,并将transitioningDelegate设置为上面创建的管理类FLTransitionManager对象,然后调用present方法。不会有任何事情发生,因为我告诉系统我要定制这个礼物,那么系统不会帮你管理它。 (个人意见,如果理解错误,请指正~~),那么我需要给系统一个控制器,管理控制器和特效之间的跳转。 iOS 8之后,系统提供了一个返回这样一个控制器的API,这是UIViewControllerTransitioningDelegate的代理方法。它返回一个UIPresentationController 实例。需要继承和定制,然后告诉它要呈现的视图,这样才能呈现。那么iOS7应该如何处理呢? Portal.h 文件

* * * * * * * * * * * * * * * * * * * * * * * * * *

#import@interface FLPresentationController : UIPresentationController

@结尾

* * * * * * * * * * * * * * * * * * * * * * * * * *

.m 文件

#import "FLPresentationController.h"

@实现FLPresentationController{

//封面视图

UIView *coverView;

}

/**

* @作者孔繁烈, 16-09-02 06:09:59

*

* 重写构造方法并添加效果

*

* @parampresentedViewController 正在呈现的控制器

* @parampresentingViewController 正在呈现的控制器

*

* @return 返回值说明

*/

- (instancetype)initWithPresentedViewController:(UIViewController *)presentedViewControllerpresentingViewController:(UIViewController *)presentingViewController{

if (self=[超级initWithPresentedViewController:presentedViewControllerpresentingViewController:presentingViewController]) {

//添加一些特效什么的~~~ 这里我们简单添加一个被覆盖的视图来简单演示一下效果。

coverView=[[UIView 分配] init];

coverView.backgroundColor=[UIColor redColor];

coverView.alpha=0.0;

}

返回自我;

}

/**

* @作者孔繁烈, 16-09-02 05:09:36

*

* 准备展示

*/

- (void)presentationTransitionWillBegin{

NSLog(@"现在将开始");

//简单地添加效果

coverView.frame=self.containerView.bounds;

[self.containerView addSubview:coverView];

//最重要最重要最重要将要呈现的视图添加到容器中,否则无法呈现,因为系统不知道要呈现什么,必须最后添加

[self.containerView addSubview:self.presentedView];

idcoordinator=self.presentingViewController.transitionCoordinator;

[协调员animateAlongsideTransition:^(idcontext) {

coverView.alpha=1;

} 完成:nil];

}

/**

* @作者孔繁烈, 16-09-02 06:09:12

*

* 现在结束

*

* @param Completed 完整的描述

*/

- (void)presentationTransitionDidEnd:(BOOL)完成{

NSLog(@"当前确实结束");

如果(!完成){

[coverViewremoveFromSuperview];

}

}

/**

* @作者孔繁烈, 16-09-02 06:09:15

*

* 准备解雇

*/

- (void)dismissalTransitionWillBegin{

NSLog(@"解雇将开始");

idcoordinator=self.presentingViewController.transitionCoordinator;

[协调员animateAlongsideTransition:^(idcontext) {

coverView.alpha=0.0;

} 完成:nil];

}

/**

* @作者孔繁烈, 16-09-02 06:09:18

*

* 取消结束

*

* @param Completed 完整的描述

*/

- (void)dismissalTransitionDidEnd:(BOOL)完成{

NSLog(@"解雇确实结束");

如果(完成){

[coverViewremoveFromSuperview];

}

}4.此时在FLTransitionManager的m文件中实现presentationControllerForPresentedViewController代理方法,返回定制的FLPresentationController,就OK了/**

* @作者孔繁烈, 16-09-02 05:09:19

*

* 返回一个控制器,用于控制控制器之间的跳转效果(注意此API仅在iOS8之后可用)

*

* @parampresented 正在呈现的控制器

* @param 呈现正在呈现的控制器

* @param source 谁打电话给现在

*

* @return 返回一个控制器,用于控制控制器之间的跳转效果

*/

- (nullable UIPresentationController *)presentationControllerForPresentedViewController:(UIViewController *)呈现presentingViewController:(UIViewController *)呈现sourceViewController:(UIViewController *)源NS_AVAILABLE_IOS(8_0){

返回[[FLPresentationController alloc] initWithPresentedViewController:presentedpresentingViewController:presenting];

}5.至此终于可以调用了。调用只需要比平常多几行代码~~SecondViewController *vc=[[SecondViewController alloc] init];

UINavigationController *nav=[[UINavigationController alloc] initWithRootViewController:vc];

nav.modalPresentationStyle=UIModalPresentationCustom;

nav.transitioningDelegate=[FLTransitionManager shareManager];

[自我呈现ViewController:nav动画:YES完成:nil];

直接调用Dismiss,无需设置任何内容。

[自我解雇ViewControllerAnimated:YES完成:nil]; 6。最后附上效果图~~~哈哈,谢谢你的辛苦! 2.gif

总结来了!

其实没什么好说的。展望未来~~上面实现的是动画切换,还有一个是交互切换。我给你一张图片看看iOS 7中视图控制器的切换.png 好吧,还不够清楚!参考这个--iOS7中自定义View Controller切换效果

文章到此结束,如果本次分享的创新Modal动画效果制作指南和的问题解决了您的问题,那么我们由衷的感到高兴!

用户评论

∞◆暯小萱◆

真是太酷了!自己弄一套特效感觉真的很有成就感

    有14位网友表示赞同!

陌上花

我一直都很想学习前端开发,这东西能让我更进一步了解框架

    有10位网友表示赞同!

醉枫染墨

这个看起来超有用的技能啊,以后做网页设计的时候可以来试试看

    有20位网友表示赞同!

醉婉笙歌

不知道要怎么开始呀,有没有视频教程能跟着学?

    有18位网友表示赞同!

搞搞嗎妹妹

感觉Modal这个东西在网站上真的很常见,自定义转场应该会让界面更有趣

    有5位网友表示赞同!

红尘烟雨

我想要做一个梦幻类的效果,不知道能不能用这个方法实现?

    有16位网友表示赞同!

此刻不是了i

如果转场动画做得太复杂会不会影响网站加载速度?

    有14位网友表示赞同!

孤廖

希望这篇文章能详细介绍一些不同的转场效果啊!

    有11位网友表示赞同!

淡抹丶悲伤

看了标题感觉很有潜力啊!期待看到成品的效果展示

    有19位网友表示赞同!

仰望幸福

学习一下自定义Modal转场,我就能打造更高端的网页作品啦

    有20位网友表示赞同!

旧事酒浓

我想试试用这个方法做一个酷炫的登录界面

    有8位网友表示赞同!

莫飞霜

不知道有没有可以预先预览效果的工具?

    有18位网友表示赞同!

命里缺他

这篇文章会不会涉及到一些高阶前端知识啊?我有点担心自己看不懂

    有8位网友表示赞同!

予之欢颜

如果有代码示例,就更好理解了

    有10位网友表示赞同!

见朕骑妓的时刻

希望能够实现鼠标悬停触发不同转场的效果

    有15位网友表示赞同!

夜晟洛

期待看到一些实用的应用场景,比如电商网站或者游戏

    有6位网友表示赞同!

一样剩余

这篇文章是不是适用于所有的前端框架?还是有一些特定的限制?

    有11位网友表示赞同!

走过海棠暮

学习自定义Modal能让我更深入地理解网页的动画效果原理吗?

    有15位网友表示赞同!

我没有爱人i

以后做网站设计的时候可以尝试用这个方法,让页面更加活泼有趣!

    有15位网友表示赞同!

生命一旅程

我很想尝试一下自己动手实现一个转场效果,看看能做出怎样的创意。

    有19位网友表示赞同!

【创新Modal动画效果制作指南】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活