zoukankan      html  css  js  c++  java
  • [Swift通天遁地]九、拔剑吧-(7)创建旋转和弹性的页面切换效果

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/10356817.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    目录:[Swift]通天遁地Swift

    本文将演示使用第三方类库,创建旋转和弹性的页面切换效果。

    首先确保已经安装了所需的第三方类库。双击查看安装配置文件【Podfile】

    1 platform :ios, '12.0'
    2 use_frameworks!
    3 
    4 target 'DemoApp' do
    5     source 'https://github.com/CocoaPods/Specs.git'
    6     pod 'GuillotineMenu'
    7 end

    根据配置文件中的相关设置,安装第三方类库。

    安装完成之后,双击打开项目文件【DemoApp.xcodeproj】

    在左侧的项目导航区,打开视图控制器的代码文件【ViewController.swift】

    现在开始编写代码,实现菜单的选择切换效果。

      1 import UIKit
      2 //引入已经安装的第三方类库
      3 import GuillotineMenu
      4 
      5 //使当前的视图控制器类,遵循表格的代理协议和数据源协议。
      6 class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
      7     
      8     //初始化两个浮点类型的属性,作为单元格的高度。
      9     fileprivate let cellHeight: CGFloat = 210
     10     fileprivate let cellSpacing: CGFloat = 20
     11     //初始化一个断头台切换动画属性,
     12     //第三方类库之所以名为断头台,是因为页面的切换效果,
     13     //有点类似于断头刀斜落到样式。
     14     fileprivate lazy var presentationAnimator = GuillotineTransitionAnimation()
     15     
     16     override func viewDidLoad() {
     17         super.viewDidLoad()
     18         
     19         //获得当前导航控制器的导航条。
     20         let navBar = self.navigationController!.navigationBar
     21         //设置导航条的前景颜色。
     22         navBar.barTintColor = UIColor(red: 65.0 / 255.0, green: 62.0 / 255.0, blue: 79.0 / 255.0, alpha: 1)
     23         //设置导航条的富文本属性
     24         navBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
     25         
     26         //初始化一个矩形区域,作为表格视图的显示区域。
     27         let rect = CGRect(x: 0, y: 0,  320, height: 508)
     28         //初始化一个指定显示区域的表格视图
     29         let tableView = UITableView(frame: rect)
     30         
     31         //设置表格对象的数据源和代理对象。
     32         tableView.dataSource = self
     33         tableView.delegate = self
     34         //设置表格对象的分隔线为空白。
     35         tableView.separatorStyle = .none
     36         
     37         //将表格对象,添加到根视图。
     38         self.view.addSubview(tableView)
     39     }
     40     
     41     //添加一个代理方法,用来设置表格的行数。
     42     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
     43     {
     44         //在此设置表格的行数拥有5行单元格。
     45         return 5
     46     }
     47     
     48       //添加一个代理方法,用来设置单元格的高度。
     49     func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
     50     {
     51         //在此设置单元格的高度为160
     52         return 160
     53     }
     54     
     55      //添加一个代理方法,用来初始化或复用表格中的单元格。
     56     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
     57     {
     58         //创建一个字符串常量,作为单元格的复用标识,
     59         let identifier = "reusedCell"
     60         //然后根据复用标识,从表格中获得可以复用的单元格。
     61         var cell = tableView.dequeueReusableCell(withIdentifier: identifier)
     62         
     63         //如果没有可以复用的单元格,
     64         if(cell == nil)
     65         {
     66             //则初始化一个自定义的单元格,并设置单元格的复用标识。
     67             cell = UITableViewCell(style: .default, reuseIdentifier: identifier)
     68             //从项目中读取一张图片素材
     69             let image = UIImage(named: "content_1")
     70             //初始化一个图像视图对象,用来显示加载的图片。
     71             let imageView = UIImageView(frame: CGRect(x: 30, y: 30,  250, height: 144))
     72             //设置图像视图的显示内容。
     73             imageView.image = image
     74             //设置图像视图的标识值为1,
     75             imageView.tag = 1
     76             //然后将图像视图添加到单元格。
     77             cell?.addSubview(imageView)
     78         }
     79         
     80         //设置单元格的背景颜色
     81         cell?.backgroundColor = UIColor(red: 51.0/255, green: 51.0/255, blue: 51.0/255, alpha: 1.0)
     82         
     83         //返回设置好的单元格。
     84         return cell!
     85     }
     86     
     87     //添加一个方法,作为故事板中的按钮控件所绑定的动作。
     88     @IBAction func showMenuAction(_ sender: UIButton)
     89     {
     90         //从故事板中,获得指定标识符的视图控制器。
     91         let menuViewController = storyboard!.instantiateViewController(withIdentifier: "MenuViewController")
     92         //设置视图控制器的展示方式为自定义
     93         menuViewController.modalPresentationStyle = .custom
     94         //设置视图控制器的转换代理对象为当前的视图控制器。
     95         menuViewController.transitioningDelegate = self
     96         
     97         //设置断头台切换动画属性的动画代理对象。
     98         presentationAnimator.animationDelegate = menuViewController as? GuillotineAnimationDelegate
     99         //设置动画属性的支持视图,为导航控制器的导航控件条。
    100         presentationAnimator.supportView = navigationController!.navigationBar
    101         //设置动画属性的展现按钮,为当前事件的按钮控件。
    102         //当点击该按钮时,执行断头台式的切换动画。
    103         presentationAnimator.presentButton = sender
    104         //在当前的控制器,展示菜单视图控制器。
    105         present(menuViewController, animated: true, completion: nil)
    106     }
    107 }
    108 
    109 //对视图控制器类进行扩展
    110 extension ViewController: UIViewControllerTransitioningDelegate
    111 {
    112     //创建一个扩展方法,用来设置菜单视图控制器在斜落时的动画模式。
    113     func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning?
    114     {
    115         //设置动画的模式为展示,共有两种模式,
    116         //一种为展示模式,另一种为消失模式。
    117         presentationAnimator.mode = .presentation
    118         return presentationAnimator
    119     }
    120     
    121     //创建另一个扩展方法,用来设置菜单视图控制器在返回时的动画模式。
    122     func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning?
    123     {
    124         //设置动画的模式为消失
    125         presentationAnimator.mode = .dismissal
    126         return presentationAnimator
    127     }
    128 }

    在项目文件夹上点击鼠标右键,弹出右键菜单。

    【New File->【Cocoa Touch->【Next】->

    【Class】:MenuViewController

    【Subclass of:UIViewController

    【Language】:Swift

    ->Next->【Create】

    点击打开【MenuViewController.swift】,

    现在开始编写代码,创建一个菜单视图控制器。 

      1 import UIKit
      2 //引入已经安装的第三方类库
      3 import GuillotineMenu
      4 
      5 //使当前的视图控制器类,
      6 //遵循断头台菜单,表格的代理协议,和数据源协议。
      7 class MenuViewController: UIViewController, GuillotineMenu, UITableViewDelegate, UITableViewDataSource {
      8     
      9     //添加一个按钮属性,和一个标签对象。
     10     //按钮控件用于隐藏菜单视图控制器,
     11     var dismissButton: UIButton?
     12     //标签用于菜单视图控制器的顶部标题。
     13     var titleLabel: UILabel?
     14     
     15     override func viewDidLoad() {
     16         super.viewDidLoad()
     17         
     18         //初始化按钮控件
     19         dismissButton = {
     20             //设置按钮控件的显示区域。
     21             let button = UIButton(frame: .zero)
     22             //给按钮控件设置正常状态下的图标。
     23             button.setImage(UIImage(named: "ic_menu"), for: .normal)
     24             //给按钮绑定点击事件
     25             button.addTarget(self, action: #selector(dismissButtonTapped(_:)), for: .touchUpInside)
     26             //然后返回设置好的按钮控件。
     27             return button
     28         }()
     29         
     30         //对另一个标签属性进行初始化操作。
     31         titleLabel = {
     32             //初始化标签对象
     33             let label = UILabel()
     34             //设置标签控件允许显示一行的文字。
     35             label.numberOfLines = 1
     36             //设置标签控件的字体属性和文字颜色。
     37             label.text = "Activity"
     38             //设置标签控件的尺寸符合其内容的长度,
     39             label.font = UIFont.boldSystemFont(ofSize: 17)
     40             label.textColor = UIColor.white
     41             label.sizeToFit()
     42             //返回设置好的标签控件
     43             return label
     44         }()
     45         
     46         //创建一个矩形区域,作为表格视图的显示区域。
     47         let rect = CGRect(x: 0, y: 60,  320, height: 448)
     48         //初始化一个指定显示区域的表格对象。
     49         let tableView = UITableView(frame: rect)
     50         
     51         //设置表格对象的数据源和代理对象,为当前的视图控制器对象。
     52         tableView.dataSource = self
     53         tableView.delegate = self
     54         //设置表格对象的分割线为空白。
     55         tableView.separatorStyle = .none
     56         
     57         //将表格视图添加到根视图中。
     58         self.view.addSubview(tableView)
     59         
     60         //初始化一个按钮控件,作为菜单视图控制器的关闭按钮。
     61         let close = UIButton(frame: CGRect(x: 20, y: 520,  280, height: 40))
     62         //设置按钮在正常状态下的标题文字。
     63         close.setTitle("Close", for: .normal)
     64         //给按钮绑定点击事件。
     65         close.addTarget(self, action: #selector(MenuViewController.dismissButtonTapped(_:)), for: .touchUpInside)
     66         
     67         //将按钮添加到根视图中。
     68         self.view.addSubview(close)
     69     }
     70     
     71     //添加一个代理方法,用来设置表格的行数,
     72     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
     73     {
     74         //在此设置表格拥有5行单元格。
     75         return 5
     76     }
     77     
     78      //添加一个代理方法,用来设置单元格的高度。
     79     func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
     80     {
     81         //在此设置单元格的高度为160
     82         return 160
     83     }
     84     
     85      //添加一个代理方法,用来初始化或复用表格中的单元格。
     86     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
     87     {
     88         //创建一个字符串常量,作为表格的复用标识。
     89         let identifier = "reusedCell"
     90         //然后根据复用标识,从表格中获取可以复用的单元格。
     91         var cell = tableView.dequeueReusableCell(withIdentifier: identifier)
     92         
     93         //如果没有可以复用的单元格,
     94         if(cell == nil)
     95         {
     96             //则初始化一个自定义的单元格,并设置单元格的复用标识。
     97             cell = UITableViewCell(style: .default, reuseIdentifier: identifier)
     98             //从项目中读取一张图片素材
     99             let image = UIImage(named: "content_2")
    100             //初始化一个指定显示区域的视图对象。
    101             let imageView = UIImageView(frame: CGRect(x: 30, y: 30,  250, height: 144))
    102             //设置图像视图的内容,
    103             imageView.image = image
    104             //并设置图像视图的标记的值为1。
    105             imageView.tag = 1
    106             //将图像视图添加到根视图
    107             cell?.addSubview(imageView)
    108         }
    109         
    110         //设置按钮的背景颜色
    111         cell?.backgroundColor = UIColor(red: 76.0/255, green: 74.0/255, blue: 88.0/255, alpha: 1.0)
    112         //然后返回设置好的单元格。
    113         return cell!
    114     }
    115     
    116     //添加一个方法,用来响应关闭按钮的点击事件。
    117     @objc func dismissButtonTapped(_ sender: UIButton)
    118     {
    119         //当关闭按钮被点击时,隐藏菜单视图控制器。
    120         presentingViewController!.dismiss(animated: true, completion: nil)
    121     }
    122 }
    123 
    124 //对菜单视图控制器进行扩展。
    125 extension MenuViewController: GuillotineAnimationDelegate
    126 {
    127     //添加一个方法,用来监听展现动画完成的事件。
    128     func animatorDidFinishPresentation(_ animator: GuillotineTransitionAnimation)
    129     {
    130         print("menuDidFinishPresentation")
    131     }
    132     
    133     //添加一个方法,用来监听消失动画完成的事件。
    134     func animatorDidFinishDismissal(_ animator: GuillotineTransitionAnimation)
    135     {
    136         print("menuDidFinishDismissal")
    137     }
    138     
    139     //添加一个方法,用来监听展现动画即将开始的事件。
    140     func animatorWillStartPresentation(_ animator: GuillotineTransitionAnimation)
    141     {
    142         print("willStartPresentation")
    143     }
    144     
    145     //添加一个方法,用来监听消失动画即将开始的事件。
    146     func animatorWillStartDismissal(_ animator: GuillotineTransitionAnimation)
    147     {
    148         print("willStartDismissal")
    149     }
    150 }

    在左侧的项目导航区,打开故事板文件。选择故事板中的初始视图控制器。

    依次点击:

    【Editor】编辑器->【Embed In】植入->【Navigation Controller】导航控制器

    属性检查器:【Status Bar】:Light Content

    选择另一个视图控制器的根视图,设置背景颜色Background

    选择控制器的导航条。设置导航条的标题文字。【Title】:Activity

    点击控件库图标。打开控件库的列表窗口。

    在按钮控件上双击,往故事板中插入一个按钮。点击创建的按钮控件。

    设置按钮的标题文字。设置按钮的图标。

    点击尺寸检查器图标,进入尺寸设置面板。设置按钮的宽度和高度。

    选择当前的视图控制器。点击辅助编辑器图标,打开辅助编辑器。隐藏右侧的面板区。

    将类文件中的方法和故事板中的按进行连接。

    完成控件和属性的连接之后,点击顶部的显示标准编辑器图标,

    切换至标准编辑器模式。显示右侧的面板区。

    点击控件库图标,打开控件库的列表窗口。

    然后在视图控制器控件的上方双击,往故事板中插入一个控制器。

    选择左边的视图控制器,在视图控制器图标上按下鼠标右键,

    并拖动到右侧的视图控制器。以创建两者之间的连接。

    在弹出的选项列表中,选择【Show】显示选项。

    点击身份检查器图标,进行身份设置面板。

    【Class】:MenuViewController,设置视图控制器所绑定的类名。

    在此设置新的视图控制器,和菜单视图控制器类进行绑定,

    接着设置视图控制器,在故事板中的唯一标识符。

    【Storyboard ID:MenuViewController

    选择菜单视图控制器的根视图。点击属性检查器图标,进行属性设置面板。

    设置背景颜色Background

    以上就完成了所有的代码编写和界面绘制工作。

  • 相关阅读:
    git 的学习使用记录
    Servlet发送邮件遇到的问题SMTPSendFailedException 554
    如何高效地写CSS--等以后有空多加总结一下
    前端技术科技树梳理
    React了解
    读取Excel文件
    Eclipse不能自动编译 java文件
    破天荒地敲下第一篇
    SRM DIV2 569 TheDeviceDiv2
    SRM DIV2 570 RobotHerbDiv2
  • 原文地址:https://www.cnblogs.com/strengthen/p/10356817.html
Copyright © 2011-2022 走看看