swift中VC页面跳转的动画效果-push和pop时的动画效果

swift详解之二十七------------自定义UINavigationController的push和pop动画 自定义UINavigationController的push和pop动画我们这里先创建一个简单的工程 , 在storyboard 中拖一个导航控制器 , rootViewController 改成我们的ViewController 。为了实现自定义动画切换 , 我们需要实现两个协议 。 UIViewControllerAnimatedTransitioning,UINavigationControl 阅读详情

752372-20160506140551404-1611089788.png

CGAffineTransform相关函数

页面动画的跳转.zip

相关代码

import UIKit

class ViewController: UIViewController,UINavigationControllerDelegate,UIViewControllerAnimatedTransitioning,UIViewControllerInteractiveTransitioning {

    /**
     UINavigationControllerOperation 表示navigation的过度效果,是一个枚举值
     push 推送效果 pop 效果 none 没有效果
     */
    var navigationOperation: UINavigationControllerOperation? //过度效果

    weak var transitionContext: UIViewControllerContextTransitioning?
    weak var transitingView: UIView?
    var isTransiting: Bool = false

    override func viewDidLoad() {
        super.viewDidLoad()

        self.navigationController!.delegate = self
        self.navigationController!.view.backgroundColor = UIColor.whiteColor()

        //添加了手势?
        let popRecognizer = UIScreenEdgePanGestureRecognizer(target: self, action: #selector(ViewController.handlePopRecognizer(_:)))
        popRecognizer.edges = UIRectEdge.Left
        self.navigationController?.view.addGestureRecognizer(popRecognizer)
    }

    /**
     手势方法
     - parameter popRecognizer: 手势
     */
    func handlePopRecognizer(popRecognizer: UIScreenEdgePanGestureRecognizer) {

        var progress = popRecognizer.translationInView(navigationController?.view).x/(navigationController?.view.bounds.size.width)!
        progress = min(1.0, max(0.0, progress))
        //progress代表的是手势的x方向移动的数值与整个平宽的比例,如果移动超过一半,则退出页面
        print(progress)

        if popRecognizer.state == UIGestureRecognizerState.Began {
            isTransiting = true //这个重点,添加true时表示可以动画处理
            self.navigationController!.popViewControllerAnimated(true) //添加可实现动画效果
        } else if popRecognizer.state == UIGestureRecognizerState.Changed {
            updateWithPercent(progress)
            print("change")
        } else if popRecognizer.state == UIGestureRecognizerState.Ended || popRecognizer.state == UIGestureRecognizerState.Cancelled {

            finishBy(progress < 0.5) //当缩小到0.5的时候直接退出
            print("Ended || Cancelled")
            isTransiting = false
        }
    }

    /**
     根据数据转换
     - parameter percent: pi
     */
    func updateWithPercent(percent: CGFloat) {
        //转化成CGFloat方法CGFloat(),括号了放入值即可 fabsf()是用来转换格式时估算值的
        let scale = CGFloat(fabsf(Float(percent - CGFloat(1.0)))) //各种转换格式
        transitingView?.transform = CGAffineTransformMakeScale(scale, scale)
        transitionContext?.updateInteractiveTransition(percent)
    }

    //手势结束,退出页面时调用的方法
    func finishBy(cancelled: Bool) {
        if cancelled {
            UIView.animateWithDuration(0.4, animations: { 
                self.transitingView?.transform = CGAffineTransformIdentity
                }, completion: { (completed) in
                    self.transitionContext?.cancelInteractiveTransition()
                    self.transitionContext?.completeTransition(false)
            })
        } else {

            UIView.animateWithDuration(0.4, animations: { 
                print(self.transitingView)
                self.transitingView?.transform = CGAffineTransformMakeScale(0, 0)
                print(self.transitingView)
                }, completion: { (completed) in
                    self.transitionContext?.finishInteractiveTransition()
                    self.transitionContext?.completeTransition(true)
            })
        }
    }

    //这个家伙貌似一直没动
    func startInteractiveTransition(transitionContext: UIViewControllerContextTransitioning) {
        self.transitionContext = transitionContext

        let containerView = transitionContext.containerView()
        let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)
        let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)
        containerView!.insertSubview((toViewController?.view)!, belowSubview: (fromViewController?.view)!)
        self.transitingView = fromViewController?.view
    }

    // UINavigationControllerDelegate
    func navigationController(navigationController: UINavigationController, animationControllerForOperation operation: UINavigationControllerOperation, fromViewController fromVC: UIViewController, toViewController toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {

        navigationOperation = operation
        return self
    }

    /**
     用于判断交互动画的代理方法,如果不返回self,则手势控制动画就没用什么用了
     - parameter navigationController: 导航控制器
     - parameter animationController:  动画页面
     - returns: 返回的是参与交互的控制器,返回空页面不交互
     */
    func navigationController(navigationController: UINavigationController, interactionControllerForAnimationController animationController: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? {
        if !self.isTransiting {
            return nil
        }
        return self
    }

    //UIViewControllerTransitioningDelegate 设置过渡时间
    func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval {
        return 0.5
    }

    /**
     过度的动画添加方法,里边用于添加矩阵等,用于页面的旋转等各种动画
     - parameter transitionContext: 代理接收到的上下文,对上下文进行设置创建动画效果
     */
    func animateTransition(transitionContext: UIViewControllerContextTransitioning) {

        let containerView = transitionContext.containerView()
        let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)
        let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)
        var destView: UIView!
        var destTransform: CGAffineTransform! //。。。矩阵

        //推得时候的动画推送效果
        if navigationOperation == UINavigationControllerOperation.Push {
            containerView?.insertSubview(toViewController!.view, aboveSubview: fromViewController!.view)
            destView = toViewController!.view
            destView.transform = CGAffineTransformMakeScale(1, 0.1)
            destTransform = CGAffineTransformMakeScale(1, 1)

        } else if navigationOperation == UINavigationControllerOperation.Pop {

            containerView!.insertSubview(toViewController!.view, belowSubview: fromViewController!.view)

            destView = fromViewController!.view
            destTransform = CGAffineTransformMakeScale(0.1, 1)
//            destTransform = CGAffineTransformMakeRotation(CGFloat(M_PI))
//            destTransform = CGAffineTransformScale(destTransform, 0.1, 1)
//            destTransform = CGAffineTransformRotate(destTransform, CGFloat(M_PI))
        }


        UIView.animateWithDuration(transitionDuration(transitionContext), animations: {
            destView.transform = destTransform
            }, completion: ({completed in
                if transitionContext.transitionWasCancelled() {
                    //                    destView.removeFromSuperview()
                }
                //告诉系统你的动画过程已经结束,这是非常重要的方法,必须调用。
                transitionContext.completeTransition(!transitionContext.transitionWasCancelled())
            }))

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}
swift-iOS自定义转场动画-push和pop iOS7.0后苹果提供了自定义转场动画的API,利用这些API我们可以改变 push和pop(navigation非模态),present和dismiss(模态),标签切换(tabbar)的默认转场动画。 立即下载

相关推荐

swift CATransition页面跳转动画

xcode6.3编译,通过swift语言代码方式编写页面跳转动画

push出页面和present一样底部垂直出现(从下向上推出)

//MARK: Push动画 ///从下向上推出(push出页面 ----&gt; 从底部到顶部 垂直出现-消失) func setPushAnimatedWithTransition(customSelf: UINavigationController) { if #available(iOS 9.0, *) { } let an...

FlyingFireFish的博客 2578

Swift 中经典各种切换动画

该源码 展示了SWift下 经典的视图动画,属性动画,以及各种相关动画分类效果。是动画参考的好源码

Swift-->ViewController跳转,转场以及自定义动画

IOS常用的转场方式: 1:UINavigationController的pushViewController打开,popViewController关闭; 2:UIViewController的presentViewController打开,dismissViewController关闭; 当然你也可以直接使用rootViewController赋值的方式…(本文暂不介绍此方法)1:首先看一

<angcyo>菜鸟视角 7002

利用Swift实现各类的CATransition动画详解

CATransition动画主要在过渡时使用,比如两个页面层级改变的时候添加一个转场效果。CATransition分为两类,一类是公开的动画效果,一类是非公开的动画效果。这篇文章主要给大家介绍了关于如何利用Swift实现各类CATransition动画的相关资料,需要的朋友可以参考下。

抖音a_bogus参数逆向避坑指南:从环境检测到XHR请求的全流程解析

本文详细解析了抖音a_bogus参数在v1.0.1.19版本下的逆向工程全流程,重点介绍了如何通过PyV8Env框架进行有效的补环境操作,以绕过严格的环境检测。内容涵盖从环境初始化、关键事件触发到模拟XHR请求获取签名的完整步骤,并提供了可运行的Python代码示例和常见检测点的避坑指南,帮助开发者稳定生成有效的a_bogus参数。

tech5的博客 600

Swift基础之自定义PUSH和POP跳转动画

之前用OC代码写过PUSH和POP的转场动画,闲来无事,将其转换成Swift语言,希望对大家有帮助,转载请注明。。。。如何实现PUSH和POP的转场动画?首先,创建一个NSObject的类,分别用来实现PUSH和POP的动画效果创建PUSH文件,实现扇形效果,代码如下:需要注意的是,代理的实现方法要完整var transitionContextT:UIViewControllerContextTr

hbblzjy的博客 3234

Loupe Browser实战指南:解锁10xGenomics单细胞数据的可视化奥秘

本文提供了Loupe Browser的实战指南,帮助用户无需编程即可探索和可视化10xGenomics单细胞数据。文章详细介绍了从数据导入、界面导航到细胞亚群鉴定、差异基因分析的核心操作流程,并分享了高级技巧与避坑指南,是快速上手这一强大可视化工具的必备参考。

weixin_29313423的博客 206

iOS Swift开发 navigation模式自定义pop和push动画

Swift navigation pop push 自定义动画

持续学习和分享感兴趣的技术 892

TI IWR6843AOP雷达+DCA1000EVM数据采集:官方手册里的坑,我帮你踩完了

本文详细解析了TI IWR6843AOP雷达与DCA1000EVM数据采集实战中的12个关键细节,包括硬件连接陷阱、mmWave Studio隐藏设置、数据采集参数优化等,帮助开发者避开官方手册未提及的常见问题,提升数据采集效率和系统稳定性。

weixin_28366475的博客 1102

设备管理器找不到蓝牙?从驱动到BIOS的系统排查指南

在Windows系统中,蓝牙功能依赖硬件、驱动、系统服务三层协同工作。设备管理器作为硬件状态的可视化窗口,当蓝牙设备消失时,往往意味着某一层链路中断。常见原因包括BIOS无线开关关闭、驱动异常、蓝牙支持服务被禁用,或系统文件损坏。排查思路应从基础概念出发,先理解蓝牙设备在设备管理器中的四种隐藏位置,再通过扫描硬件、检查BIOS、重装驱动、修复服务等步骤逐层定位。这一方法不仅适用于Windows电脑,也适用于HC-05、ESP32等嵌入式蓝牙模块,因为硬件、协议栈、应用层的故障逻辑相通。掌握这套技术价值在于减

weixin_33377602的博客 267

【iOS(swift)笔记-4】Push页面隐藏tabor,Pop回来自动显示tabbar(这样tabbar就不会有从下往上弹出的动作)

先设置hidesBottomBarWhenPushed = true然后紧接着在跳转页面的代码后设置hidesBottomBarWhenPushed = falseself.hidesBottomBarWhenPushed = trueself.navigationController?.pushViewController(LoginViewController(), animated: tru...

xihuandaxiaojie的专栏 1165

microblaze之Video Processing Subsystem调试误区

内容:总结video processing subsystem调试中遇到的问题,以及在解决问题中的思路方法论,引为前车之鉴。 1,我的目的是希望采用vps中的scaler模块对图像进行拉伸缩小。IP的配置如下: 2,整个系统的框架图如下,仅比上期的内容增加了scaler模块,如下: 3,查手册,可以知道这个scaler only组件分成了hscale,vscale和GPIO,其中GPIO是控制上下游stream流控设备复位用,暂时忽略。 hscale和vscale的寄存器空间如下,主要关注图

YDY5659150的专栏 3555

自定义控制器的转场动画(Push、Pop)

文/JohnsonChou(简书作者) 原文链接:http://www.jianshu.com/p/59224648828b 著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。 自iOS7之后,引进了新的API来构造UIViewController之间的转场动画,经过几天的研究,终于做出了一个小Damo,来粗浅谈谈。 这几个API如下: UIVie

andy_jiangbin的专栏 562

指纹对抗指南:如何绕过Cloudflare与Akamai的5s盾与浏览器指纹检测

现在的CDN反爬技术虽然越来越强,但是道高一尺魔高一丈,只要掌握了指纹伪造、流量伪装、行为模拟这些核心技术,就可以绕过绝大多数的防护措施。对抗过程中要注意效率和成本的平衡,小规模爬取用Playwright+stealth最方便,大规模爬取用curl_cffi+代理池性价比最高,遇到验证码用打码平台或者自动识别服务,不需要死磕破解。本文介绍的方案已经在实战中验证过,可以绕过95%以上的Cloudflare/Akamai防护,成功率非常高。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 295

手撕Lua字节码:从黑盒到透明

lua 字节码 怎么‘手撕’一个 chunk 看看里面啥样?我手里有一个.luac或出来的二进制字节码,想知道里面到底是什么结构、哪些字段、有哪些指令,怎么一步一步“拆箱”,从一个黑盒变成有迹可循的东西?也就是:不满足于只会loadpcall而是想亲眼看看一个 chunk 内部长啥样,甚至写点工具把它解析出来。这篇就用带你从“拿到一坨.luac不搞高深玄学,尽量让你看完就能自己动手。注:以 Lua 5.3/5.4 为主,细节各版本略有不同,但大体套路是一致的。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 98

iOS 开发--转场动画

"用过格瓦拉电影,或者其他app可能都知道,一种点击按钮用放大效果实现转场的动画现在很流行,效果大致如下:"   本文主讲SWIFT版,OC版在后面会留下Demo下载 在iOS中,在同一个导航控制器你可以自定义转场动画实现两个viewController之间的过渡。实际上在iOS7之后,通过实现 UIViewControllerAnimatedTransitioning或者...

weixin_34119545的博客 208

69、SAP数据库归档重做日志备份策略与工具详解

本文详细解析了SAP数据库归档重做日志备份的重要性及策略,介绍了SAP提供的备份工具brarchive及其配置和使用方法,探讨了BRBACKUP与BRARCHIVE的联合运行、一致在线备份、备用数据库备份场景以及备份策略的综合应用与优化。此外,还分析了备份过程中常见问题的解决方法、备份监控与评估流程、与第三方备份解决方案的集成方式,以及未来备份技术的发展趋势和应对策略。通过合理运用这些策略和工具,可以有效保障SAP数据库的安全性和可恢复性。

peace的博客 135

实现类似于格瓦拉启动页中的放大转场动画(OC&Swift)

本文是投稿文章,作者:HenryCheng  (简书上的链接: http://www.jianshu.com/p/8c29fce5a994) 一、前言 用过格瓦拉电影,或者其他app可能都知道,一种点击按钮用放大效果实现转场的动画现在很流行,效果大致如下 在iOS中,在同一个导航控制器你可以自定义转场动画实现两个viewController之间的过

wsh7365062的博客 1041

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

iOS页面跳转、传参的简单易用的库:JSegue

为什么80%的码农都做不了架构师?>>> ...

weixin_33755557的博客 101

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

一步步教你实现类似于格瓦拉启动页中的放大转场动画(Objective C & Swift)

一、前言 用过格瓦拉电影,或者其他app可能都知道,一种点击按钮用放大效果实现转场的动画现在很流行,效果大致如下 在iOS中,在同一个导航控制器你可以自定义转场动画实现两个viewController之间的过渡。实际上在iOS7之后,通过实现UIViewControllerAnimatedTransitioning或者UIViewControllerContextTransitioning协议...

weixin_34032827的博客 246

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

掌握TransitionTreasury协议:NavgationTransitionable与ModalTransitionDelegate详解

想要为你的iOS应用添加炫酷的页面切换动画吗?TransitionTreasury框架提供了简单而强大的解决方案!这款Swift视图控制器转场框架通过NavgationTransitionable与ModalTransitionDelegate两大核心协议,让开发者能够轻松实现各种自定义转场动画。本文将深入解析这两个关键协议的使用方法和最佳实践,帮助你快速掌握TransitionTreasury的

gitblog_00570的博客 375

教你实现类似于格瓦拉启动页中的放大转场动画(OC&Swift)

教你实现类似于格瓦拉启动页中的放大转场动画(OC&amp;Swift)  一、前言   用过格瓦拉电影,或者其他app可能都知道,一种点击按钮用放大效果实现转场的动画现在很流行,效果大致如下 在iOS中,在同一个导航控制器你可以自定义转场动画实现两个viewController之间的过渡。实际上在iOS7之后,通过实现UIViewControllerAnimatedTransiti...

weixin_34375233的博客 102

返回到navigationcontroller的根视图然后push一个

//跳到登录界面         for (int i = 0; i self.navigationController.viewControllers.count; i++) {             if ([[self.navigationController.viewControllers objectAtIndex:i] class] == [LoadingViewContro

海蛎煎 589

UITabbarController + UINavigationController隐藏tabbar

UITabbarController + UINavigationController 的组合很经常使用。通常是UITabbarController作为window的根视图控制器,然后其他VC使用UINavigationController 因此,在其他VC进行push操作的时候,常常需要将tabbar隐藏起来,在pop回去的时候重现显示。这个需求大多通过UIViewController的hide...

weixin_33836874的博客 560
上一篇: 创建xib的view
下一篇: 创建连续的有编辑状态的按钮
瓦怕落地
博客等级 码龄11年 16粉丝 118原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值