Ben*_*ard 2 cocoa-touch uiviewcontroller uiview bounds ios
我推送一个视图控制器(mainVC)并添加一些子视图.大多数这些视图都是按需构建的,因为用户采取了一些操作.
当我构建每个视图时,我指的是mainVC.view.bounds调整视图的大小.根据需求构建的那些大小很好,但第一个(我添加viewDidLoad)似乎没有考虑隐藏的导航栏或未隐藏的工具栏 - 我不确定哪个.
其他问题似乎向我保证,viewDidLoad是引用边界和添加这些子视图的正确位置.我被误导了吗?记录产生以下结果:
在viewDidLoad界限高度是548.
在viewWillAppear边界高度为460(-44 x 2).在viewWillAppear我隐藏导航栏,但前后的高度是相同的.
以后,边界高度为504(-44 x 1).
为什么在我尝试读取它时,边界高度没有更新viewDidLoad?
视图控制器生命周期在适用于iOS的View Controller Programming Guide中进行了描述.
简而言之,当-view被称为第一次时,-viewDidLoad被称为.即使视图控制器对视图做的第一件事是设置框架,它仍然需要访问视图.
UIViewController *controller = [MyViewController myViewController];
// -viewDidLoad has not been called (if +myViewController doesn't call -view.)
UIView *view = [controller view];
// -viewDidLoad has been called.
view.frame = [UIApplication sharedApplication].delegate.window.bounds;
Run Code Online (Sandbox Code Playgroud)
即使你使用controller.view.frame相同的逻辑顺序发生.-viewDidLoad将始终是一个调用新的反序列化视图,该视图尚未嵌入到视图层次结构中.
更新
这种情况早先不清楚,我指出为什么没有正确设置视图边界-viewDidLoad.只有在-viewDidLoad视图控制器的视图添加到视图层次结构之后.这是在设置视图的最后一帧时.
如果必须使框架具有正确的尺寸,则可以使用IB设置您需要的尺寸或(如果不使用IB)设置框架-loadView.这种方法是有缺陷的,因为它静态地将帧的大小设置为可以在-viewDidLoad被调用之后改变的值(诸如在呼叫状态栏之类的内容).
更新2
您需要从定位和大小调整子视图中拆分添加子视图.
如果您从故事板或Nib加载,那么您是正确的,应该添加所需的其他视图-viewDidLoad.如果您以编程方式加载,则会添加所有子视图-loadView.
第二项任务是定位和调整子视图的大小.首选方法是使用UIView.autoresizingMask,但为了更精确的布局,KVO view.bounds并在视图控制器的视图更改其大小时调整自定义子视图.
| 归档时间: |
|
| 查看次数: |
7371 次 |
| 最近记录: |