特性三、控制器视图生命周期函数

1、我们在开发iOS程序的过程中一定是要用到显示view的,那么具体的控制器视图的view到底是如何去实现调用的。
测试实例:在一个控制器中需要modal另外一个控制器,通过自定义view的变化去测试view的frame如何去改变

1、1 新建一个LifeDemoViewController.swift控制器

class LifeDemoViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
         print("\(__FUNCTION__) \(view.frame)")

    }

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        var screenBounds = UIScreen.mainScreen().bounds
        screenBounds.size.width += 20
        view.frame = screenBounds

       print("\(__FUNCTION__) \(view.frame)")

    }

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        print("\(__FUNCTION__) \(view.frame)")
    }


    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

//        var screenBounds = UIScreen.mainScreen().bounds
//        screenBounds.size.width += 20
//        view.frame = screenBounds

       print("\(__FUNCTION__) \(view.frame)")
    }

    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        print("\(__FUNCTION__) \(view.frame)")
    }

    override func loadView() {
        super.loadView()
        var screenView = UIScreen.mainScreen().bounds
        screenView.size.width += 20
        view = UIView(frame: screenView)

        view.backgroundColor = UIColor.lightGrayColor()
        let v = LifeView()
        v.frame = screenView
        view.addSubview(v)
       print("\(__FUNCTION__) \(view.frame)")
    }

1、2 自定义 LifeView.swift

class LifeView: UIView {

    override init(frame: CGRect) {
        super.init(frame: frame)
        backgroundColor = UIColor.blueColor()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        print("\(__FUNCTION__) \(frame)")
    }

}

1.3、在控制器中modal
class ViewController: UIViewController {

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    let Vc = LifeDemoViewController()
    presentViewController(Vc, animated: true, completion: nil)

}
override func viewDidLoad() {
    super.viewDidLoad()
    print(__FUNCTION__)
    print(view)

}

测试分析结果:
1、如果自定义的view使用自动布局去完成,当view的frame加上20之后,打印的结果:
自动布局运行结果
loadView() (0.0, 0.0, 0.0, 0.0)
viewDidLoad() (0.0, 0.0, 0.0, 0.0)
viewWillAppear (0.0, 0.0, 0.0, 0.0)
viewWillLayoutSubviews() (0.0, 0.0, 375.0, 667.0)
viewDidLayoutSubviews() (0.0, 0.0, 375.0, 667.0)
layoutSubviews() (0.0, 0.0, 375.0, 667.0)
viewDidAppear (0.0, 0.0, 375.0, 667.0)

2、在自定义的view中指定视图的大小
loadView() (0.0, 0.0, 395.0, 667.0)
viewDidLoad() (0.0, 0.0, 395.0, 667.0)
viewWillAppear (0.0, 0.0, 395.0, 667.0)
viewWillLayoutSubviews() (0.0, 0.0, 375.0, 667.0)
viewDidLayoutSubviews() (0.0, 0.0, 375.0, 667.0)
layoutSubviews() (0.0, 0.0, 375.0, 667.0)
viewDidAppear (0.0, 0.0, 375.0, 667.0)

  • viewWillLayoutSubviews 函数中,视图的大小被修改为 屏幕的大小,自动布局系统做的

3、根据一般情况我们把view的frame 设置在didLayoutSubviews函数中
loadView() (0.0, 0.0, 395.0, 667.0)
viewDidLoad() (0.0, 0.0, 395.0, 667.0)
viewWillAppear (0.0, 0.0, 395.0, 667.0)
viewWillLayoutSubviews() (0.0, 0.0, 375.0, 667.0)
viewDidLayoutSubviews() (0.0, 0.0, 395.0, 667.0)
layoutSubviews() (0.0, 0.0, 395.0, 667.0)
viewDidAppear (0.0, 0.0, 395.0, 667.0)

但是,在 dismiss 的时候,会执行
viewWillLayoutSubviews() (0.0, 667.0, 395.0, 667.0)
viewDidLayoutSubviews() (0.0, 0.0, 395.0, 667.0)
造成了屏幕的闪动

总结: dismiss 回到屏幕使用自动布局,它会每次重新加载layoutSubviews去布局实现 跳动效果

3、使用非自动布局,纯代码设置控件大小,dismiss 的时候,不会调用 viewDidLaouySubviews
loadView() (0.0, 0.0, 395.0, 667.0)
viewDidLoad() (0.0, 0.0, 395.0, 667.0)
viewWillAppear (0.0, 0.0, 395.0, 667.0)
viewWillLayoutSubviews() (0.0, 0.0, 375.0, 667.0)
viewDidLayoutSubviews() (0.0, 0.0, 375.0, 667.0)
layoutSubviews() (0.0, 0.0, 395.0, 667.0)
viewDidAppear (0.0, 0.0, 375.0, 667.0)

所以:
1、dismiss 的时候仍然会调用 viewDidLayoutSubviews
自定义 Modal 转场的注意事项
需要指定控制器根视图的大小
2、不要使用自动布局,否则会调用 viewDidLayoutSubviews
使用自动布局定义控件,视图大小会变成屏幕大小,如果强行设置,dismiss 又回造成屏幕闪烁!

结果需要给iOS 5

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值