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 次 |
最近记录: |