Skip to content

TongFangyuan/CustomTransitionDemo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 

Repository files navigation

CustomTransitionDemo

今日头条小视频动画过渡效果实现

效果图

image

原理

自动定义 presentdismiss 动画,设置 viewControllertransitioningDelegate 为自定义类对象(ImageOpeningTransitioningDelegate),自己实现过渡动画即可,本文主要讲解present自定义过渡实现

1.设置 transitioningDelegate 为 self.customTransitioningDelegate,该对象遵循 UIViewControllerTransitioningDelegate 协议,


...
VideoDetailsViewController *detailsViewController = [[VideoDetailsViewController alloc] init];
detailsViewController.transitioningDelegate = self.customTransitioningDelegate;
...
[self presentViewController:detailsViewController animated:YES completion:nil];

2.在 present 控制器时,会调用其animationControllerForPresentedController:presentingController: 方法,该方法需要返回一个遵守 UIViewControllerAnimatedTransitioning 协议的对象,这里我们单独抽象出一个类(ImageOpeningPresenter),


-(id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source
{
return [ImageOpeningPresenter new];
}

UIViewControllerAnimatedTransitioning 协议需要实现的方法


@protocol UIViewControllerAnimatedTransitioning <NSObject>

// 过渡动画需要的事件
- (NSTimeInterval)transitionDuration:(nullable id <UIViewControllerContextTransitioning>)transitionContext;
// 过渡上下文, transitionContext 包含参与过渡的对象,比如目标控制器和源控制器,拿到这两个控制器我们就可以写交互动画了
- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext;

@optional

3.重写 animateTransition: 方法

通过 transitionContext 获取源控制器和目标控制器


ViewController *sourceViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
VideoDetailsViewController *targetViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

获取 containerView ,这个视图是最底层的 view,相当于整个过渡动画的舞台,所有对象的动画过程都在它上面呈现


UIView *containerView = [transitionContext containerView];

过渡动画代码


/// 完整动画代码在 ImageOpeningPresenter.m 文件 animateTransition: 方法中

NSTimeInterval animationDuration = [self transitionDuration:transitionContext];

...

[UIView animateWithDuration:animationDuration delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^{
    ...
}
completion:^(BOOL finished) {

    ...
    // 转场结束,这个代码很关键,一定要调用
    [transitionContext completeTransition:![transitionContext transitionWasCancelled]];
    
}];

其他

仓库地址

How to close a modal by dragging it down

About

今日头条小视频动画过渡效果实现

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy