我正在创建一个这样的视图控制器:
MyViewController* viewController = [[MyViewController alloc] initWithNibName:nil bundle:nil];
viewController.view.frame = CGRectMake(0,0,320,300);
[self addChildViewController:viewController];
[self.view addSubview:viewController.view];
[viewController didMoveToParentViewController:self];
显然我希望视图的大小为0,0,320,300。
但是,在设置框架之前调用viewDidLoad,因此在viewDidLoad中我得到了这个:
<UIView: 0x155d3180; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x155c20c0>>
所以新视图控制器中的视图基于568的高度而不是我想要的300来布局。我该怎么做才能防止使用错误的帧大小创建这个新视图?
答案 0 :(得分:3)
您拨打viewController.view
(后跟.frame
)是触发对viewDidLoad
的调用的原因。
正确的解决方案是在视图控制器的viewWillLayoutSubviews
方法中布局子视图,而不是viewDidLoad
。
答案 1 :(得分:1)
fist of all,加载xib文件时调用viewDidload。它仍然具有默认大小。这是改变尺寸的测试结果(在iPad屏幕上):
{{0, 0}, {768, 1004}} viewDidLoad
{{0, 0}, {768, 1004}} shouldAutorotateToInterfaceOrientation:
{{0, 0}, {768, 1004}} shouldAutorotateToInterfaceOrientation:
{{0, 0}, {768, 1004}} viewWillAppear:
{{0, 0}, {768, 1004}} shouldAutorotateToInterfaceOrientation:
{{0, 0}, {768, 1004}} shouldAutorotateToInterfaceOrientation:
{{0, 0}, {768, 1004}} willRotateToInterfaceOrientation:duration:
{{0, 0}, {1024, 748}} viewWillLayoutSubviews
{{0, 0}, {1024, 748}} layoutSubviews
{{0, 0}, {1024, 748}} viewDidLayoutSubviews
{{0, 0}, {1024, 748}} willAnimateRotationToInterfaceOrientation:duration:
{{0, 0}, {1024, 748}} shouldAutorotateToInterfaceOrientation:
{{0, 0}, {1024, 748}} viewDidAppear:
如您所见,查看viewDidLoad中的帧并不完全正确。
其次,我认为您的代码运行良好。也许你应该检查MyViewController中的其他代码
答案 2 :(得分:1)
我认为您希望在新的ViewController viewDidLoad
中获得适当的大小。当您调用viewController.view
时,视图框初始化。什么时候会调用新的ViewController loadView
,其中视图将使用框架(0 0; 320 568)然后viewDidLoad
初始化,因此在view.frame = CGRectMake(0,0,320,300);
中调用viewDidLoad
的时间要晚于loadView
{1}}。
您可以在新的ViewController - (void)loadView{
[super loadView];
self.view.frame = CGRectMake(0,0,320,300);
}
中尝试此操作:
initFrame
如果要在外部设置框架,可以为新的ViewController添加- (id)initWithMyFrame:(CGRect)myFrame{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
self.myInitFrame = initFrame;
}
return self;
}
- (void)loadView{
[super loadView];
self.view.frame = self.myInitFrame;
}
属性和新的init方法:
{{1}}
答案 3 :(得分:0)
如何打电话
self.view.frame = CGRectMake(0,0,320,300);
在MyViewController的ViewDidLoad中