AddChildViewCtroller切换 View
ViewController4种切换方式
1、presentViewController
适合于顺序型的页面转换,比如说某中验证(登录信息)型的,而且可以通过dismissViewController方便的回到父页面,默认动画从上而下。
2、pushViewController
通过导航进行页面 push。层级感比较强,切换方式为左右,通过 pop 可以很容易跳转到指定 ViewController。
3、addChildViewController
在没有导航控制器的情况下在多层次的视图页面中自由跳转,优点:
- 页面逻辑很清晰,相应的View对应相应的ViewController。
- 当某个子View没有显示时,将不会被Load,减少了内存的使用。
- 当内存紧张时,没有Load的View将被首先释放,优化了程序的内存释放机制。
- 一个页面中可以添加多个ViewController,并且可以在需要显示时才load它。
- 页面的切换方式可以在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
}
}
}
}
效果展示: