项目可直接在https://code.youkuaiyun.com/netluoriver/ios_liftcircle下载
新建一个项目,在UIViewController中Modal出lifeCircleViewcontroller,在UIViewController中添加如下代码:
//
// ViewController.swift
// 生命周期演示
//
// Created by LeeMinglu on 15/10/23.
// Copyright © 2015年 http://blog.youkuaiyun.com/netluoriver. All rights reserved.
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
//点击屏幕Modal出生命周期的控制器
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
let vc = lifeCircleViewController()
presentViewController(vc, animated: true, completion: nil)
}
}
</span>
新建lifeCircleViewController.swift,其中代码显示如下:
//
// lifeCircleViewController.swift
// 生命周期演示
//
// Created by LeeMinglu on 15/10/23.
// Copyright © 2015年 http://blog.youkuaiyun.com/netluoriver. All rights reserved.
import UIKit
class lifeCircleViewController: UIViewController {
override func loadView() {
view = UIView()
view.backgroundColor = UIColor.greenColor()
print("\(__FUNCTION__) frame: \(view.frame)")
}
override func viewDidLoad() {
super.viewDidLoad()
print("\(__FUNCTION__) frame: \(view.frame)")
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
print("\(__FUNCTION__) frame: \(view.frame)")
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
print("\(__FUNCTION__) frame: \(view.frame)")
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
print("\(__FUNCTION__) frame: \(view.frame)")
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
print("\(__FUNCTION__) frame: \(view.frame)")
}
//点击屏幕后dismiss控制器
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
dismissViewControllerAnimated(true, completion: nil)
}
}
编译运行,在iPhone6,4.7寸屏幕下,在控制台中打印结果如下:
<span style="font-size:18px;">loadView() frame: (0.0, 0.0, 0.0, 0.0)
viewDidLoad() frame: (0.0, 0.0, 0.0, 0.0)
viewWillAppear frame: (0.0, 0.0, 0.0, 0.0)
viewWillLayoutSubviews() frame: (0.0, 0.0, 375.0, 667.0)
viewDidLayoutSubviews() frame: (0.0, 0.0, 375.0, 667.0)
viewDidAppear frame: (0.0, 0.0, 375.0, 667.0)</span>
上面的顺序就是iOS加载控件的顺序,初始化时如果没有指定view的frame,在viewWillLayoutSubviews之前view的尺寸都为0
自定义一个lifeCircleView.swift,在lifeCircleView中加入layoutSubViews,代码如下:
//
// lifeCircleView.swift
// iOS生命周期简单演示
//
// Created by LeeMinglu on 15/10/24.
// Copyright © 2015年 http://blog.youkuaiyun.com/netluoriver. All rights reserved.
//
import UIKit
class lifeCircleView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = UIColor.redColor()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func layoutSubviews() {
super.layoutSubviews()
print("\(__FUNCTION__) frame: \(frame)")
}
}
在lifeViewController.swift中修改代码如下:
//
//
// lifeCircleViewController.swift
// 生命周期演示
//
// Created by LeeMinglu on 15/10/23.
// Copyright © 2015年 http://blog.youkuaiyun.com/netluoriver. All rights reserved.
import UIKit
class lifeCircleViewController: UIViewController {
override func loadView() {
view = UIView()
view.backgroundColor = UIColor.greenColor()
print("\(__FUNCTION__) frame: \(view.frame)")
let lifeCircle = <span style="color:#ff6666;">lifeCircleView()
//将自定义的lifeCircleView视图添加到lifeCircleViewController中
view.addSubview(lifeCircle)
//设置自动布局
//取消translatesAutoresizing布局
lifeCircle.translatesAutoresizingMaskIntoConstraints = false
//设置View的自动布局
view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[lifeCircle]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["lifeCircle" : lifeCircle]))
view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[lifeCircle]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["lifeCircle" : lifeCircle]))
</span>
}
override func viewDidLoad() {
super.viewDidLoad()
print("\(__FUNCTION__) frame: \(view.frame)")
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
print("\(__FUNCTION__) frame: \(view.frame)")
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
print("\(__FUNCTION__) frame: \(view.frame)")
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
print("\(__FUNCTION__) frame: \(view.frame)")
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
print("\(__FUNCTION__) frame: \(view.frame)")
}
//点击屏幕后dismiss控制器
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
dismissViewControllerAnimated(true, completion: nil)
}
}
loadView() frame: (0.0, 0.0, 0.0, 0.0)
viewDidLoad() frame: (0.0, 0.0, 0.0, 0.0)
viewWillAppear frame: (0.0, 0.0, 0.0, 0.0)
viewWillLayoutSubviews() frame: (0.0, 0.0, 375.0, 667.0)
viewDidLayoutSubviews() frame: (0.0, 0.0, 375.0, 667.0)
layoutSubviews() frame: (0.0, 0.0, 375.0, 667.0)
viewDidAppear frame: (0.0, 0.0, 375.0, 667.0)
而且得出一个结论:iOS控件的布局都是在 LayoutSubviews中进行的.
lifeCircleViewController