在IOS开发过程中,会经常使用自动布局和代码共同实现功能展示。自动布局会根据IOS设备类型,屏幕大小进行控件尺寸的动态调整来完成应用的屏幕适配,那么如何在代码中获取当前控件具体尺寸呢?
应用场景:比如我们的应用要求根据不同的业务场景,动态调整界面展示的内容,导致在不同条件下需要在同一个UIView中加入不同类型的子View。那么如何保证子View可以根据父View尺寸来进行自动调整呢?自然需要知道当前父View的尺寸,子View可以根据尺寸类设计,那么如何获取父View的尺寸呢?何时获取尺寸才合适?
UIViewController生命周期:
(void)loadView
(void)viewDidLoad
(void)viewWillAppear
(void)viewWillLayoutSubviews
(void)viewDidLayoutSubviews
(void)viewDidAppear
(void)viewWillDisappear
(void)viewDidDisappear
其中loadView、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear,不需要在此叙述,他们的执行顺序和完成的内容可以参考UIViewController生命周期的各类文章,在此主要讨论的是其中另外两个常常被忽视的方法:viewWillLayoutSubviews、viewDidLayoutSubviews。
在介绍这两个方法之前,需要了解的是UIView中的layoutSubViews方法,这个方法是在UIView发生变化时(包括子view发生变化,自身尺寸调整等),重新调整子View的方法。对的,就是这个方法,这个方法会适应UIView的调整,我们可以在需要的时候对其内部的子View进行尺寸属性等的修改来满足新场景的需求。
同理,在UIViewController中,viewWillLayoutSubviews和viewDidLayoutSubviews是加载控制器子View时相关两个方法,类似viewWillAppear和viewDidAppear,viewWillLayoutSubviews是在加载子View之此前调用,viewDidLayoutSubviews是加载子View完毕后调用。也就是说,当控制器执行到viewDidLayoutSubviews时,所有的内部控件都已经加载完毕,意味着尺寸大小已经确定,此时的尺寸就是未来在屏幕中加载出来的View的尺寸,这就是我们想要的。
所以,在IOS开发中我们应该注意以下几个几点:1、不要把所有的初始化操作都安排在viewDidLoad中,应该根据具体的要求选择合适的加载时机;2、为布局做准备的操作可以在viewWillLayoutSubviews之前做,如决定子view的加载类型可以在viewDidLoad中进行判断,而在总体布局基础上上进行调整时需要在viewDidLayoutSubviews中操作(自动布局);3、不要在viewDidLoad等方法中进行耗时操作,会影影响界面的加载效率;