Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何控制UIViewController';s视图框_Ios_Uiview_Uiviewcontroller - Fatal编程技术网

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将调用新的ViewController
loadView
,其中视图将以帧(0.0;320 568)初始化,然后调用
viewDidLoad
,因此在此处调用
view.frame=CGRectMake(0,0320300)viewDidLoad
中的布局,code>太晚

您可以在新的ViewController
loadView
中尝试此操作:

- (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;
}