如何控制UIViewController的视图框架

时间:2014-03-16 23:53:42

标签: 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.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来布局。我该怎么做才能防止使用错误的帧大小创建这个新视图?

4 个答案:

答案 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中