AddChildViewCtroller

AddChildViewCtroller切换 View

ViewController4种切换方式

1、presentViewController

适合于顺序型的页面转换,比如说某中验证(登录信息)型的,而且可以通过dismissViewController方便的回到父页面,默认动画从上而下。

2、pushViewController

通过导航进行页面 push。层级感比较强,切换方式为左右,通过 pop 可以很容易跳转到指定 ViewController。

3、addChildViewController

在没有导航控制器的情况下在多层次的视图页面中自由跳转,优点:

  1. 页面逻辑很清晰,相应的View对应相应的ViewController。
  2. 当某个子View没有显示时,将不会被Load,减少了内存的使用。
  3. 当内存紧张时,没有Load的View将被首先释放,优化了程序的内存释放机制。
  4. 一个页面中可以添加多个ViewController,并且可以在需要显示时才load它。
  5. 页面的切换方式可以在transitionViewController中选择

iOS 5后ViewController中新添加了下面几个方法。
​​​​​​​

addChildViewController:    
removeFromParentViewController   
transitionFromViewController:toViewController:duration:options:animations:completion:  //切换页面显示调用
willMoveToParentViewController: 
didMoveToParentViewController:

4、自定义

使用AddChildViewcontroller切换视图(Object-C)

 使用该功能可以解决多label切换控制器的需求。

使用AddChildViewcontroller简单切换视图、可以运用到多分栏子页面切换(没有切换父控制器),以下只是简单使用AddChildViewcontroller,并没有明显切换过程,如果需要,可以自己添加按钮切换。

切换过渡代码段:

    /// 切换子控制器
    ///这种方式可以保证同一时刻只有一个subController
    ///- parameter old : 之前的控制器
    ///- parameter new : 之后的控制器
    ///- warning : 传入的参数必须有共同的父容器控制器。且不能传入父容器控制器(建议制作容器,不要做View显示操作。)
    fileprivate func transition(old: UIViewController, new:UIViewController) -> Void {
        self.transition(from: old, to: new, duration: 0.1, options: .curveEaseIn, animations: {
            //过渡操作
        }) { (isFinish) in
            if isFinish{
                self.currentViewController = new  //currentViewController 自定义新添加的。
            }else {
                self.currentViewController = old
            }
        }
    }
 

示例代码:

import UIKit

class ViewController: UIViewController { //这里的Controller 建议只做容器Controller 不做界面显示
    
    var vc1: UIViewController!
    var vc2: UIViewController!
    var currentViewController : UIViewController!
    override func viewDidLoad() {
        super.viewDidLoad()
        initConrollers()
        currentViewController = self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    //MARK: -private method
    ///初始化和调整Controller
    ///建议使用for循环和数组处理
    func initConrollers() -> Void {
         vc1 =  self.storyboard?.instantiateViewController(withIdentifier: String(describing: SencondViewController.self))
        vc1.view.frame = CGRect(origin: CGPoint.init(x: 0, y: 40), size: vc1.view.bounds.size) //调整下frame 以显示顶部的label选项卡
        self.addChildViewController(vc1!)
        vc1.didMove(toParentViewController: self)  //建议调用该方法
         vc2 =  self.storyboard?.instantiateViewController(withIdentifier: String(describing: ThirdViewController.self))
         vc2.view.frame = CGRect(origin: CGPoint.init(x: 0, y: 40), size: vc2.view.bounds.size)
        self.addChildViewController(vc2!)
        vc2.didMove(toParentViewController: self)
        self.view.addSubview(vc1.view)  //显示某个控制器下的View【第一个要显示的View】
        //
    }
    //MARK: -IBAction
    @IBAction func toViewController1ButtonTap(_ sender: UIButton, forEvent event: UIEvent) {
        self.transition(old: vc2, new: vc1)
//        vc2.view.removeFromSuperview()
//        self.view.addSubview(vc1.view)
        
    }
    
    @IBAction func toViewController2ButtonTap(_ sender: UIButton) {
        self.transition(old: vc1, new: vc2)
//        vc1.view.removeFromSuperview()
//         self.view.addSubview(vc2.view)//如果使用这个切花Veiw 记得先移除,不然就会有两层,建议是哟并transitionxxxxxxx
    }
    

    /// 切换子控制器
    ///这种方式可以保证同一时刻只有一个subController
    ///- parameter old : 之前的控制器
    ///- parameter new : 之后的控制器
    ///- warning : 传入的参数必须有共同的父容器控制器。且不能传入父容器控制器(建议制作容器,不要做View显示操作。)
    fileprivate func transition(old: UIViewController, new:UIViewController) -> Void {
        self.transition(from: old, to: new, duration: 0.1, options: .curveEaseIn, animations: {
            //过渡操作
        }) { (isFinish) in
            if isFinish{
                self.currentViewController = new  //currentViewController 自定义新添加的。
            }else {
                self.currentViewController = old
            }
        }
    }
}

效果展示:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值