首页 > 其他分享 >自定义转场

自定义转场

时间:2024-09-13 09:15:58浏览次数:12  
标签:自定义 转场 transitionContext let func toViewController UIViewController

在iOS中,自定义转场动画可以通过实现 UIViewControllerAnimatedTransitioning 协议来为模态(modal)和推送(push)转场提供自定义动画。以下是这两种转场的具体实现方式:

1. 自定义模态转场

Step 1: 创建转场代理

创建一个遵循 UIViewControllerAnimatedTransitioning 协议的类:

import UIKit

class CustomModalTransition: NSObject, UIViewControllerAnimatedTransitioning {
    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
        return 0.5 // 设置转场的持续时间
    }

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
        guard let fromViewController = transitionContext.viewController(forKey: .from),
              let toViewController = transitionContext.viewController(forKey: .to) else { return }
        
        let containerView = transitionContext.containerView
        containerView.addSubview(toViewController.view)
        
        // 设置初始状态
        toViewController.view.alpha = 0.0
        
        UIView.animate(withDuration: transitionDuration(using: transitionContext), animations: {
            // 进行动画
            toViewController.view.alpha = 1.0
        }) { _ in
            // 完成转场
            transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
        }
    }
}

Step 2: 设置转场代理

在要展示模态的 ViewController 中设置转场代理:

class FirstViewController: UIViewController, UIViewControllerTransitioningDelegate {
    func presentModal() {
        let secondVC = SecondViewController()
        secondVC.modalPresentationStyle = .custom
        secondVC.transitioningDelegate = self
        present(secondVC, animated: true, completion: nil)
    }

    func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        return CustomModalTransition()
    }

    func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        return CustomModalTransition() // 也可以实现dismiss动画
    }
}

2. 自定义推送转场

Step 1: 创建转场代理

创建一个遵循 UIViewControllerAnimatedTransitioning 协议的类,类似于模态转场:

class CustomPushTransition: NSObject, UIViewControllerAnimatedTransitioning {
    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
        return 0.5
    }

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
        guard let fromViewController = transitionContext.viewController(forKey: .from),
              let toViewController = transitionContext.viewController(forKey: .to) else { return }
        
        let containerView = transitionContext.containerView
        containerView.addSubview(toViewController.view)
        
        // 设置初始状态
        toViewController.view.transform = CGAffineTransform(translationX: containerView.bounds.width, y: 0)
        
        UIView.animate(withDuration: transitionDuration(using: transitionContext), animations: {
            // 进行动画
            fromViewController.view.transform = CGAffineTransform(translationX: -containerView.bounds.width, y: 0)
            toViewController.view.transform = .identity
        }) { _ in
            // 完成转场
            transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
        }
    }
}

Step 2: 设置转场代理

在使用 UINavigationControllerViewController 中设置转场代理:

class FirstViewController: UIViewController, UINavigationControllerDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        navigationController?.delegate = self
    }

    func pushNextViewController() {
        let nextVC = SecondViewController()
        navigationController?.pushViewController(nextVC, animated: true)
    }

    func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationController.Operation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        if operation == .push {
            return CustomPushTransition()
        }
        return nil
    }
}

标签:自定义,转场,transitionContext,let,func,toViewController,UIViewController
From: https://www.cnblogs.com/Tamako-/p/18411560

相关文章

  • ByteTrak训练自定义训练集
    ByteTrack目标追踪训练主要参考的博文是https://blog.csdn.net/Ddddd4431/article/details/126910083但是这位博主的数据集准备跟我的还有点不一样,他用的是labelimg标注,我用的是Darklabel对视频直接进行标注。而ByteTrak的训练格式是COCO数据集格式。而Darklabel对视频标注生......
  • 旋转按钮—C#自定义控件1
    C#自定义控件—旋转按钮 C#用户控件之旋转按钮按钮功能:手自动旋转,标签文本显示、点击二次弹框确认(源码在最后边);【制作方法】找到控件的中心坐标,画背景外环、内圆;再绘制矩形开关,进行角度旋转即可获得;【关键节点】No.1获取中心坐标,思考要绘制图形的相对坐标、宽度......
  • C#中设置自定义控件工具箱图标
    在设计自定义控件时,系统默认生成的图标比较单一且难看,如何为控件设计自己的图标呢,这里给出了一种基于ToolBoxBitmap 属性设置自定义控件工具箱图标的方法。1、首先将图标文件名改为自定义控件名,如自定义控件类为: public partial class UserDefindControl: UserControl {......
  • PbootCMS如何取消后台、留言、自定义表单验证码
    取消PBootCMS后台、留言、自定义表单的验证码是一个相对直接的过程。如果你想要取消这些地方的验证码,可以按照以下步骤操作:登录后台:使用管理员账号登录PBootCMS的后台管理系统。进入全局配置:在后台管理界面中,找到“全局配置”或类似的设置入口。找到安全配置:在......
  • vue3 h5自定义tabbar并用keep-alive保存缓存路由
            路由嵌套封装tabbar组件创建一个容器放tabbar和子路由keep-alive保存路由状态1.路由嵌套{ path:'/', name:'index', component:()=>import('@/views/index.vue'), children:[ { path:'', redirect:'/com', m......
  • VUE自定义指令
    在Vue.js中,自定义指令允许你创建自己的DOM操作逻辑。虽然Vue3中的自定义指令相对较少使用(因为许多功能可以通过组件和其他API实现),但它们仍然是一个有用的工具。下面是如何在Vue中创建和使用自定义指令的基本步骤。1.创建自定义指令自定义指令可以通过app.directive......
  • Zabbix自定义监控项与触发器
            当我们需要获取某台主机上的数据时,直接利用zabbix提供的模板可以很方便的获得需要的数据,但是有些特别的数据,利用这些现有的模板或监控项是无法实现的,例如网站状态信息的监控、mysql数据库主从状态等信息。这是就需要自己定义键值和监控项,以满足企业对检测数......
  • DevExpress WinForms中文教程:Data Grid - 如何自定义行和单元格的样式?
    在本教程中您将学习如何使用事件更改数据单元格样式,您将从要给显示任务数据的网格开始,并且没有应用条件格式。通过处理GridView.RowStyle事件,您将对Priority字段值为High的行应用不同的背景颜色。然后如果Status设置为New,您将使用GridView.RowCellStyle事件来突出显示这些行中的St......
  • 单元测试,Junit,反射,注解(元注解,自定义注解,解析注解),动态代理
    目录一、单元测试二、反射1.认识反射2.获取类3.获取类的构造器4.获取类的成员变量5.获取类的成员方法6.作用三、注解1.概述、自定义注解2.元注解3.注解的解析四、动态代理1.概述2.使用代理的好处一、单元测试单元测试就是针对最小的功能单元(方法),编写测试代码对......
  • 自定义注解校验参数
    自定义注解校验参数:1、定义注解,写好返回值,申明注解的用处,文档生成importjavax.validation.Constraint;importjavax.validation.Payload;importjava.lang.annotation.Documented;importjava.lang.annotation.Retention;importjava.lang.annotation.Target;importstat......