Ios 如何控制UIViewController';s视图框
我正在创建一个视图控制器,如下所示:Ios 如何控制UIViewController';s视图框,ios,uiview,uiviewcontroller,Ios,Uiview,Uiviewcontroller,我正在创建一个视图控制器,如下所示: MyViewController* viewController = [[MyViewController alloc] initWithNibName:nil bundle:nil]; viewController.view.frame = CGRectMake(0,0,320,300); [self addChildViewController:viewController]; [self.view addSubview:viewController.v
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,0320300
但是,在设置帧之前调用viewDidLoad,因此在viewDidLoad中我得到以下结果:
<UIView: 0x155d3180; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x155c20c0>>
因此,新视图控制器中的视图是基于568的高度而不是我想要的300的高度进行布局的。如何防止使用错误的帧大小创建此新视图?您调用的
viewController.view
(后跟.frame
)会触发调用viewDidLoad
正确的解决方案是在视图控制器的viewWillLayoutSubviews
方法中布局子视图,而不是在viewDidLoad
调用
self.view.frame = CGRectMake(0,0,320,300);
首先,在MyViewController的ViewDidLoad中,加载xib文件时调用ViewDidLoad。它仍然具有默认大小。这是一个改变尺寸的测试结果(在iPad屏幕上): 如您所见,viewDidLoad中的图幅不完全相同
第二,我认为你的代码工作得很好。也许您应该检查MyViewController中的其他代码我认为您希望在新的ViewController中获得适当的大小。当您调用
viewController.view
时,图幅初始化。when将调用新的ViewControllerloadView
,其中视图将以帧(0.0;320 568)初始化,然后调用viewDidLoad
,因此在此处调用view.frame=CGRectMake(0,0320300)对于viewDidLoad
中的布局,code>太晚
您可以在新的ViewControllerloadView
中尝试此操作:
- (void)loadView{
[super loadView];
self.view.frame = CGRectMake(0,0,320,300);
}
如果要在外部设置帧,可以为新的ViewController添加initFrame
属性和新的init方法:
- (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;
}
- (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;
}