【问题标题】:How to control a UIViewController's view frame如何控制 ViewController 视图框架
【发布时间】:2014-03-16 23:53:42
【问题描述】:

我正在创建一个这样的视图控制器:

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 进行布局。我可以做些什么来防止创建这个新视图时使用错误的帧大小?

【问题讨论】:

    标签: ios uiview uiviewcontroller


    【解决方案1】:

    您对viewController.view(后跟.frame)的调用触发了对viewDidLoad 的调用。

    正确的解决方案是在视图控制器的 viewWillLayoutSubviews 方法中布局子视图,而不是在 viewDidLoad 中。

    【讨论】:

      【解决方案2】:

      首先,在加载 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 中的其他代码

      【讨论】:

        【解决方案3】:

        我认为您希望在新的 ViewController viewDidLoad 中获得合适的大小。当您调用viewController.view 时,视图框架会初始化。何时会调用新的 ViewController loadView,其中视图将以 frame(0 0; 320 568) 和 viewDidLoad 初始化,因此您调用 view.frame = CGRectMake(0,0,320,300); 的位置对于您在 viewDidLoad 中的布局来说太晚了。

        你可以在新的 ViewController loadView 中试试这个:

        - (void)loadView{
            [super loadView];
            self.view.frame = CGRectMake(0,0,320,300);
        }
        

        如果你想在外面设置frame,你可以为新的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;
        }
        

        【讨论】:

          【解决方案4】:

          打电话呢

          self.view.frame = CGRectMake(0,0,320,300);
          

          在MyViewController的ViewDidLoad中

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-12-26
            • 1970-01-01
            • 2016-04-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-07-12
            相关资源
            最近更新 更多