文档章节

自定义UIViewController的过渡效果

daveztong
 daveztong
发布于 2014/11/06 21:25
字数 859
阅读 31
收藏 0
在iOS应用中,UIViewController是主要的组成部分,controllers可以通过navigation controllers, tab bar controllers, and modally这几种方式呈现。在ios7发布之前,控制器的展示效果都是系统预定义的,开发人员不能对其进行自定义。导航的push方式呈现控制器的时候始终是从右到左的方式。在选择任何一个Tab的时候也没有任何动画效果。modal方式也是预定义的方式(默认方式是slide-up)。 除了这些限制之外,当过度到另一个界面之后,之前的界面就完全被遮盖,使得自定义modal窗口的方式不是那么好实现。 IOS7引入了自定义界面之间的过度方式,使得使用modal方式呈现界面变得非常容易了。cheers!:) 自定义的过度方式可以自由决定是否响应用户操作在过度期间,这里只是简单演示这个新的功能,所以就不在这方面下功夫了。 ~~~~~ 下面我就来做一个简单的Demo演示这个效果。 开始之前先理清思路。我们需要创建一个animator的对象负责对界面的展示和撤销加上动画效果,当展示view controll的时候将被展示的view controller的modalPresentationStyle设置为UIModalPresentationCustom,transitionDelegate设置为实现了UIViewControllerTransitioningDelegate这个协议的对象(本例为self)。 OK,let's code: 打开XCode,选择master-detail模板,填上相应的信息: 4FBFB69F-9CF0-404D-961A-FFF0FD937DA1   记得将master-detail的segue改为modal方式的: 4AE62009-5842-45AA-8073-F4D3AD0FA665
//实现UIViewControllerTransitioningDelegate
@interface TWMasterViewController : UITableViewController <NSFetchedResultsControllerDelegate,UIViewControllerTransitioningDelegate>
实现UIViewControllerTransitioningDelegate中得方法,
-(id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source{
    TWTransitionAnimator* animator = [TWTransitionAnimator new];
    animator.presenting = YES;
    return animator;
}

-(id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed{
    TWTransitionAnimator* animator = [TWTransitionAnimator new];
    return animator;
}
上面使用到的TWTransitionAnimator就是我们用来实现自定义界面展示效果的。这个类继承NSObject需要实现UIViewControllerAnimatedTransitioning这个协议:
@interface TWTransitionAnimator : NSObject <UIViewControllerAnimatedTransitioning>
@property (nonatomic,assign) BOOL presenting;
@end
其中定义了一个presenting属性,确定当前是否在展示modal窗口。UIViewControllerAnimatedTransitioning协议中必须实现的两个方法是:
-(NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext{
    return 0.5f;
}

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

}
第一个是过度所需的时间,第二个方法才是决定动画过度效果是如何呈现的。当过度开始的时候,transitionContext中包含了关于过度的信息。包含了from,to viewController和container view(动画实际进行的地方),需要将from,to控制器添加至这个container view,并执行一些过度效果,然后告诉这个context,过度已经完成了。看下面的实现:
-(void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext{
    UIViewController* fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController* toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

    [transitionContext.containerView addSubview:fromViewController.view];
    [transitionContext.containerView addSubview:toViewController.view];

    if(self.presenting){
        fromViewController.view.userInteractionEnabled = NO;

        [UIView animateWithDuration:[self transitionDuration:transitionContext] delay:0.0f usingSpringWithDamping:0.4 initialSpringVelocity:20 options:UIViewAnimationOptionCurveEaseInOut animations:^{
            fromViewController.view.alpha = 0.5f;
            toViewController.view.frame = CGRectInset(fromViewController.view.frame, 40, 40);
        } completion:^(BOOL finished) {
            [transitionContext completeTransition:finished];
        }];
    }else{

        [UIView animateWithDuration:[self transitionDuration:transitionContext] delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
            toViewController.view.alpha = 1.0f;
            toViewController.view.userInteractionEnabled = YES;

            fromViewController.view.transform = CGAffineTransformRotate(toViewController.view.transform, -1.5);
        } completion:^(BOOL finished) {
            [transitionContext completeTransition:finished];
        }];
    }
}
这里的fromViewController和toViewController需要解释一下,当呈现modal的时候,from就是被遮盖的界面,modal就是to,当撤销modal界面的时候,from就是modal界面,而to则成了被遮盖的界面。 修改一下master界面的prepareForSegue:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{

    TWDetailViewController* detail = segue.destinationViewController;
    detail.transitioningDelegate = self;
    detail.modalPresentationStyle = UIModalPresentationCustom;
}
在detail界面添加一个Button:click to dismiss用来撤销modal界面: 2B159B1C-1CEE-4C59-A28B-C42D392795A2
- (IBAction)dismissModalView:(id)sender {

    [self dismissViewControllerAnimated:YES completion:nil];
}
OK,可以看下效果图了: 612DDBA3-CC5F-40D8-A8DA-B2E83D5562D7 源代码放在gitOSC: TWModalView

© 著作权归作者所有

上一篇: 学习学习Linux
下一篇: 洱海
daveztong
粉丝 4
博文 93
码字总数 21482
作品 0
成都
程序员
私信 提问
iOS 过渡效果--SwiftyExpandingCells

SwiftyExpandingCells 的设计灵感来自于谷歌的收件箱。SwiftyExpandingCells是 Swift 2.0 Xcode 7.0 项目中的一个实例,该实例演示了一个自定义的UIViewController 和一个可扩展的 UITableV...

匿名
2016/01/04
360
0
再谈iOS 7的手势滑动返回功能

之前随手写过一篇《使用UIScreenEdgePanGestureRecognizer实现swipe to pop效果》,挺粗糙的。 现在使用默认模板创建的iOS App都支持手势返回功能,如果导航栏的返回按钮是自定义的那么则会失...

北方人在上海
2016/06/08
21
0
modal的样式及 半透明控制器效果

modal出半透明的控制器: UIViewController * maskVC = [[UIViewController alloc] init]; //设置页面的透明度 maskVC.view.backgroundColor = [UIColor colorWithFullRed:0 green:0 blue:0......

biyu6
2016/05/26
185
0
iOS 过渡动画--JVTransitionAnimator

JVTransitionAnimator 是一个简单的过渡动画,当你呈现 UIViewController 的时候它能播放自定义动画。

孔小菜
2015/05/05
261
0
[iOS Animation]-CALayer 显示动画 对图层树的动画

对图层树的动画 CATransition并不作用于指定的图层属性,这就是说你可以在即使不能准确得知改变了什么的情况下对图层做动画,例如,在不知道UITableView哪一行被添加或者删除的情况下,直接就...

浩浩老师
2015/09/22
280
0

没有更多内容

加载失败,请刷新页面

加载更多

Java 8 Stream Api 中的 skip 和 limit 操作

1. 前言 Java 8 Stream API 中的skip()和limit()方法具有类似的作用。它们都是对流进行裁剪的中间方法。今天我们来探讨一下这两个方法。 2. skip() skip(lang n) 是一个跳过前 n 个元素的...

码农小胖哥
32分钟前
1
0
看中华小当家第二集片段记录

最近正好在学习做饭,看看这片子,燃烧燃烧做饭的热情 哈哈,以下是摘的一些句子和个人理解 My name is Liu Mao Xing . More commonly known as Mao. 个人理解:我的名字叫 刘昴星, (commo...

T型人才追梦者
37分钟前
3
0
Python基础-6

1、注释 # 单行注释'''多行注释'''"""多行注释"""# 中文编码声明注释 ,在文件开头加上下面这行注释# encoding=utf-8或者# -*- encoding:utf-8 -*- (-*- 只是为了美观,没有实际......

zfskkk
37分钟前
5
0
我的这半年 / 2018 七夕著

浑然不觉,竟已至七夕, 今年已经过了一半 , 突然想给自己记录点什么 , 回顾下我的2018, 我的这上半年. 2018的第一件记事得从一月份下旬的那场大雪说起 , 一觉醒来 , 窗外整个银装素裹 , 在此之...

gxLong
42分钟前
3
0
NSS支持的数据库

NSS,简写自Name Service Switch。我把它译为“名字服务中心”。 在*nix操作系统中,NSS是C语言库(Library C或者glibc)的一部分,用以寻找名字。比如说,我们运行ls -lh查看一个目录中的文...

大别阿郎
58分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部