每个人都知道你不能相信 UIViewController init/viewDidLoad 方法上的帧大小;这:
- (void)viewDidLoad: {
NSLog(@"%d", self.view.frame.size.width);
}
在很多情况下会打印错误的尺寸(特别是在横向模式下它几乎被破坏)
这实际上会返回始终正确的结果,因此最好布局子视图:
- (void)viewWillAppear: {
NSLog(@"%d", self.view.frame.size.width);
}
问题是 viewWillAppears 每次视图出现时都会被调用,因此不适合分配或添加子视图。所以你最终声明每一个视图在界面中,您最终会得到我根本不喜欢的巨大头文件,因为大多数项目在初始设置后不需要任何更多操作。
所以问题一是:有没有更好的方法来处理子视图定位?
问题二非常相关,假设我有一个 UIView 的子类,其中包括各种其他子视图。我在界面中声明它,并在 init/viewDidLoad 方法中分配/初始化它。
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
...
menu = [[SNKSlidingMenu alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
...
}
正如我们已经知道的,我们现在需要在 viewWillAppear 中重新定位它以获得更准确的读数
- (void)viewWillAppear:(BOOL)animated{
....
menu.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
....
}
问题是当然所有子视图也需要重新定位。这是通过自动调用的layoutSubviews函数来完成的,但我们遇到了同样的问题:所有子视图都需要在 SNKSlidingMenu 类的接口内声明。有没有办法解决这个问题?
Thanks.