2

私はストーリーボードを持っています: マイストーリーボード

ご覧のとおり、コンテナ付きのMenuViewController : UIViewControllerがあります。コンテナーは MenuTableViewController : UITableViewControllerMenuTableView : UITableViewです。

私がしたいのは、コンテナ (MenuTableViewController) のサイズを変更し、mainVC に別の子を追加することです。

MenuViewController に追加します。

-(void)viewDidAppear:(BOOL)animated {

    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
    MenuTableViewController* secondChildVC = [sb instantiateViewControllerWithIdentifier:@"MenuTableViewController"];
    [secondChildVC.view setBackgroundColor:[UIColor redColor]];
    [self addChildViewController:secondChildVC];
    NSLog(@"MenuTableViewController.view info: %@",secondChildVC.view);
    NSLog(@"secondChildVC views: %@",[secondChildVC.view subviews]);

    MenuTableViewController *firstChildVC = [self.childViewControllers objectAtIndex:0];
    [firstChildVC.view setFrame:CGRectMake(160, 0, 160, 504)];
    [firstChildVC.view setBackgroundColor:[UIColor greenColor]];
    NSLog(@"firstChildVC views: %@",[firstChildVC.view subviews]);

}

そして、これは私のログです:

MenuTableViewController.view info: <MenuTableView: 0x8910e00; baseClass = UITableView; frame = (0 20; 320 548); clipsToBounds = YES; opaque = NO; autoresize = W+H; gestureRecognizers = <NSArray: 0x761eca0>; layer = <CALayer: 0x76202b0>; contentOffset: {0, 0}>
2013-05-03 17:20:10.796 TestStories[41780:c07] secondChildVC views: (
    "<UIImageView: 0x76205e0; frame = (0 541; 320 7); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x7620680>>",
    "<UIImageView: 0x7620740; frame = (313 517; 7 7); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x76207e0>>"
)
2013-05-03 17:20:10.798 TestStories[41780:c07] firstChildVC views: (
    "<UITableViewCell: 0x7143110; frame = (0 320; 160 320); autoresize = W; layer = <CALayer: 0x713cc10>>",
    "<UITableViewCell: 0x7140b90; frame = (0 0; 160 320); autoresize = W; layer = <CALayer: 0x7140ce0>>",
    "<UIImageView: 0x7135000; frame = (0 497; 320 7); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x71351b0>>",
    "<UIImageView: 0x7135270; frame = (153 517; 7 7); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x7135310>>"
)

secondChildVC に TableViewCells が含まれていないのはなぜですか? わかりません。

背景に赤と緑の色を使用していることがわかります (secondChildCV には赤)。しかし、おそらく決して現れません。スクリーンショットは次のとおりです。 ここに画像の説明を入力

4

2 に答える 2

12

あなたはいくつかのことを間違っていると思います。子ビュー コントローラーはコンテナー ビューと同じサイズになるため、子ビュー コントローラーのサイズを変更するのではなく、コンテナー ビューに IBOutlet を設定し、そのサイズを変更する必要があります。

2 番目の子については、子として追加しますが、そのビューを MenuViewController のビューに追加することはありません。また、子として追加した直後に didMoveToParentViewController を呼び出す必要があります。したがって、次のようなことを行う必要があります。

    MenuTableViewController* secondChildVC = [self.storyboard instantiateViewControllerWithIdentifier:@"MenuTableViewController"];
   [secondChildVC.view setBackgroundColor:[UIColor redColor]];
   [self addChildViewController:secondChildVC];
   [secondChildVC didMoveToParentViewController:self];
   secondChildVC.view.frame = CGRectMake(0,0,160,504);
   [self.view addSubview:secondChildVC.view];

self.storyboard を使用すると、ストーリーボードへの参照をより簡単に取得できることにも注意してください。

于 2013-05-03T15:41:48.620 に答える
2

プログラムによるカスタム コンテナの呼び出しに関しては、rdelmar に同意します。

frameまた、自動レイアウト (iOS 6 以降のみ) を使用しているため、ビューを変更することはできません。本当に制約を変更する必要があります。自動レイアウトが必要ですか?そうでない場合は、オフにします。6.0 より前の iOS バージョンをサポートする場合、オフにする必要があります。

自動レイアウトを使用する場合は、適切な制約を作成IBOutletし、その制約の定数を使用してレイアウトを変更する必要があります。UIViewそのようにコントロールの寸法を変更するのは信じられないほど簡単です。

これをさらに一歩進めると、プログラムでビューを自動レイアウト シーンに追加すると、すべての制約を正しく設定するのが面倒になる場合があります。率直に言って、最初からシーンに 2 つのコンテナー (子ビューごとに 1 つ) を配置する方がはるかに簡単だと思います、基本的には幅をゼロに設定して 1 つを非表示にします。それらの制約を効果的に (VFL で説明する)@"|[container1][container2]|"に設定し、非表示の幅をゼロに設定することができます。次に、非表示のコンテナーを表示する場合は、その幅の制約の定数を任意の値に設定します。これを行うと、両方のコンテナーのサイズが自動的に変更されます。

于 2013-05-03T15:53:33.850 に答える