每个人都知道你不能相信 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 类的接口内声明。有没有办法解决这个问题?
谢谢。