众所周知,在UIViewController的init/viewDidLoad方法中,不能信任frame size; 这样写:
- (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 类的接口中声明。是否有绕过这个问题的方法?
谢谢。