欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Swift — UIKit 之(4)—— TabBar|ToolBar|NavigationBar

程序员文章站 2024-03-23 08:48:40
...

0. 本篇主要内容

  • TabBar
  • ToolBar
  • NavigationBar
  • 4 种转场
    • show
    • show details
    • present modally
    • present as popover

1. TabBar

[0] 长啥样

Swift — UIKit 之(4)—— TabBar|ToolBar|NavigationBar

[1] 建立项目

新建一个 Single View 的 Project,然后把原来 Main.storyboard 里面的 ViewController 删掉,然后再删掉其对应的控制类 ViewController.swift。
Swift — UIKit 之(4)—— TabBar|ToolBar|NavigationBar

[2] 添加一个 TabBarController

Swift — UIKit 之(4)—— TabBar|ToolBar|NavigationBar

[3] 添加一个 NavigationController

Swift — UIKit 之(4)—— TabBar|ToolBar|NavigationBar
效果:(我这里已经改了图标)
Swift — UIKit 之(4)—— TabBar|ToolBar|NavigationBar

2. ToolBar

这部分的操作基本都在 TabBar的第一个界面(樱桃????),这个部分我们要实现的功能是点击ToolBar中的每一个按钮,就显示其对应的界面,这里用颜色来区分。

Swift — UIKit 之(4)—— TabBar|ToolBar|NavigationBar

[4] 在TabBar的第一个界面(樱桃)添加一个ToolBar

Swift — UIKit 之(4)—— TabBar|ToolBar|NavigationBar

[5] 在ToolBar下面添加一个View并拉满

Swift — UIKit 之(4)—— TabBar|ToolBar|NavigationBar

[6] 为该界面绑定一个控制类

Swift — UIKit 之(4)—— TabBar|ToolBar|NavigationBar

[7] 绑定事件

Swift — UIKit 之(4)—— TabBar|ToolBar|NavigationBar

这里把_ sender:Any 改成 _ sender: UIBarButtonItem

[8] 编写代码
  • ToolBarPageViewController.swift
//
//  ToolBarPageViewController.swift
//  Review_)6
//
//  Created by Hedon - on 2020/5/8.
//  Copyright © 2020 Hedon -. All rights reserved.
//

import UIKit

class ToolBarPageViewController: UIViewController {

    @IBOutlet weak var contextView: UIView!
    
    //声明3个ViewController
    let vc1 = UIViewController()
    let vc2 = UIViewController()
    let vc3 = UIViewController()
    
    
    
    override func viewDidLoad() {
        super.viewDidLoad()

        //为3个ViewController设置背景颜色
        vc1.view.backgroundColor = UIColor.blue
        vc2.view.backgroundColor = UIColor.green
        vc3.view.backgroundColor = UIColor.red
        
        
        //逻辑上面加载了这三个VC,但是还不会呈现,需要我们按按钮才会呈现
        self.addChild(vc1)
        self.addChild(vc2)
        self.addChild(vc3)
        
        
        //默认是蓝色
        contextView.addSubview(vc1.view)
    }
    

    @IBAction func ItemPressed(_ sender: UIBarButtonItem) {        
        let text = sender.title
        switch text {
        case "蓝色":
            contextView.addSubview(vc1.view)
        case "绿色":
            contextView.addSubview(vc2.view)
        case "红色":
            contextView.addSubview(vc3.view)
        default:
            return
        }   
    }
}


下面我们将展示四种转场的使用方法和区别

  • show

    • ① Show

      • 后面的 3.NavigationBar 演示的就是 Show 的效果,就是将一个VC盖在另外一个VC上面,然后可以通过Back来回退到原本的VC。

      Swift — UIKit 之(4)—— TabBar|ToolBar|NavigationBar

    • ② Show Details

      • 这个在 iPad上面比较常用,目前我还没学习到 iPad 部分的知识,这里先略过。
      Swift — UIKit 之(4)—— TabBar|ToolBar|NavigationBar
  • present

    • ③ Present Modally

      • 以模态的方式展示,在取消该窗口的之前不能点击“底部”的内容

      Swift — UIKit 之(4)—— TabBar|ToolBar|NavigationBar

    • ④ Present As Popover

      • 其实就是在我们点击按钮的地方,弹出一个小窗口,当我们点击窗口的其他地方,这个小窗口就会自动消失。

        Swift — UIKit 之(4)—— TabBar|ToolBar|NavigationBar


3. NavigationBar

NavigationBar是一种层次结构(支持压栈,一个VC压着另外一个VC)。

前面的 TabBar 和 ToolBar 都是一种平展结构(每一个ViewController都是平级的)

  • 层次结构
    Swift — UIKit 之(4)—— TabBar|ToolBar|NavigationBar

  • 平展结构
    Swift — UIKit 之(4)—— TabBar|ToolBar|NavigationBar

[1] 删除原来的根视图

Swift — UIKit 之(4)—— TabBar|ToolBar|NavigationBar

[2] 添加两个ViewController并设置根视图

Swift — UIKit 之(4)—— TabBar|ToolBar|NavigationBar

[3] 加两个按钮并添加 Show 转场

Swift — UIKit 之(4)—— TabBar|ToolBar|NavigationBar
可以看到两个变化,它会自动帮我们生成一个 “Back” 的按钮,所以 Show 其实是一种压栈的方式,我们可以一层一层叠加上去,然后再一层一层退回去。
Swift — UIKit 之(4)—— TabBar|ToolBar|NavigationBar

[4] 效果

效果其实很简单,就是点击“Go”,就到达了橙色页面,然后在点击“Back”,就回到了绿色页面。

4. Present

剩下的两种转场方式 Present Modally 和 Present As Popover 我们在 TabBar 中间那个 “苹果” 来演示。

[1] 准备

Swift — UIKit 之(4)—— TabBar|ToolBar|NavigationBar

[2] 建立 Present 连接

Swift — UIKit 之(4)—— TabBar|ToolBar|NavigationBar

[3] 为转场到达的页面添加对应的控制类并绑定

因为我们要实现点击“关闭”按钮,来实现返回,所以需要为其添加对应的控制类来编写代码。

Swift — UIKit 之(4)—— TabBar|ToolBar|NavigationBar

[4] 编写返回代码

本系列的上一篇文章就讲到,Present 要搭配 dismiss

Swift — UIKit 之(4)—— TabBar|ToolBar|NavigationBar

@IBAction func closePressed(_ sender: UIButton) {
  self.dismiss(animated: true, completion: nil)
}
[5] Present Modally 效果

其实到这里,Present Modally 就可以做完了。

Swift — UIKit 之(4)—— TabBar|ToolBar|NavigationBar

Present As Popover 我们还需要再操作操作才能搞定。

[6] 为上面添加的两个转场设置辨识ID
  • 上面的叫 M
  • 下面的叫 P

Swift — UIKit 之(4)—— TabBar|ToolBar|NavigationBar

[7] 为上图左边这个 VC 添加响应的控制类并进行绑定

Swift — UIKit 之(4)—— TabBar|ToolBar|NavigationBar

[8] 编写 Prepare 方法

Swift — UIKit 之(4)—— TabBar|ToolBar|NavigationBar

[9] PresentPageViewController.swift 完整代码
//
//  PresentPageViewController.swift
//  Review_)6
//
//  Created by Hedon - on 2020/5/8.
//  Copyright © 2020 Hedon -. All rights reserved.
//

import UIKit

//为了实现Popover效果,需要添加UIPopoverPresentationControllerDelegate协议
class PresentPageViewController: UIViewController,UIPopoverPresentationControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }
    

    
    // MARK: - Navigation

    //这个prepare方法是建立本文件的时候自动生成的方法,我们只需要解开注释就可以了
    // 具体来说:Prepare 方法是指在 Present 过渡到另外一个 View Controller 之前会执行的方法
    // segue:具体是哪一个过渡
    // sender:是哪一个对象发生的
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
        
        //通过上面两行注释我们就可以读出这个prepare的方法就是用来:
        // ① 使用segue.destination获取新的视图控制器。
        // ② 将选定的对象传递给新的视图控制器。
        
        //只有是 Present As Popover 的时候才执行,这个 P 是我们前面为两个 Present 设定的辨识ID
        if segue.identifier == "P"{
            let vc = segue.destination   //转场的目标,就是我们建立的那个带有“关闭”按钮的ViewController
            let button = sender as! UIButton   //我们知道sender是一个按钮
            vc.modalPresentationStyle = .popover        //设置popover效果
            vc.preferredContentSize = CGSize(width: 200, height: 200)       //设置显示出来的框大小
            
            if let pvc = vc.popoverPresentationController{
                pvc.sourceView = button     //表示弹出的小窗口指向按钮
                pvc.sourceRect = button.bounds   //这一行没有好像也没什么区别
                pvc.permittedArrowDirections = .up   //表示箭头的指向,是指向上的
                pvc.delegate = self         //处理与弹出框相关的消息的委托
            }
            
        }
    }
    
    
    //设置横屏状态不满屏
    func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
        return .none
    }
    
    
    /**
        iPhone 下默认是 .overFullScreen(全面显示)
            需要返回 .none,否则没有弹窗效果,iPad 则不需要这一步
     */
    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        return .none
    }
}

这也是我们学习中的一些笔记,所以如果有错误的地方,敬请斧正~