6

かなり単純なことを行うのにいくつかの困難が発生しています。何かが欠けていますが、表示されません...

非常に単純なアプリ(IBを使用)で問題を再現しました:

  • アプリのメイン ViewController は UINavigationController です。
  • NavigationController のルートは「FirstViewController」です。
  • FirstViewController と SecondViewController は空の UIViewController サブクラスです。
    • クラスの作成時に XCode によって生成された XIB ファイルでは、AutoLayout が有効になっています。
    • SecondViewController の上部と下部にラベルを配置しました (垂直スペースの制約 = 0)。

ChildViewController の使用

問題は、「ChildViewControllers」メソッドを介して SecondViewController を表示すると、iPhone4 で問題が発生することです。下のラベルが表示されません。

// In FirstViewController.m
- (IBAction)child:(id)sender {
    [self addChildViewController:self.secondVC];
    [self.view addSubview:self.secondVC.view];
    [self.secondVC didMoveToParentViewController:self];
}

NavigationController の使用

NavigationController を介して「SecondViewController」を表示すると、問題なく、SecondViewController が正しく表示されます。

// In FirstViewController.m
- (IBAction)push:(id)sender {
    [self.navigationController pushViewController:self.secondVC animated:YES];
}

また、SecondViewController が NavigationController を介して一度表示されるとすぐに、常に適切に表示されます。

私は確かに何かが欠けていますが、何ですか?:p 何かアイデアはありますか?

ドロップボックスに簡単なプロジェクトをアップロードしました: https://dl.dropbox.com/u/36803737/sharebox/AutoLayoutTest.zip

ありがとう!

ジュリアン

4

1 に答える 1

28

ドロップボックス リンクが機能しないため、これを試すことができませんでした。サブビューとして追加する前に、secondVC のフレームを設定してみてください。

secondVC.view.frame = self.view.bounds;

制約を付けてやりたい場合は、次のようにします。

- (IBAction)child:(id)sender {
    [self addChildViewController:self.secondVC];
    [self.view addSubview:self.secondVC.view];
    [self constrainViewEqual:secondVC.view];
    [self.secondVC didMoveToParentViewController:self];
}

-(void)constrainViewEqual:(UIView *) view {
    [view setTranslatesAutoresizingMaskIntoConstraints:NO];
    NSLayoutConstraint *con1 = [NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeCenterX relatedBy:0 toItem:view attribute:NSLayoutAttributeCenterX multiplier:1 constant:0];
    NSLayoutConstraint *con2 = [NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeCenterY relatedBy:0 toItem:view attribute:NSLayoutAttributeCenterY multiplier:1 constant:0];
    NSLayoutConstraint *con3 = [NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeWidth relatedBy:0 toItem:view attribute:NSLayoutAttributeWidth multiplier:1 constant:0];
    NSLayoutConstraint *con4 = [NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeHeight relatedBy:0 toItem:view attribute:NSLayoutAttributeHeight multiplier:1 constant:0];
    NSArray *constraints = @[con1,con2,con3,con4];
    [self.view addConstraints:constraints];
}

私はかなり頻繁に制約を使用するので、UIView のカテゴリに上記のメソッド (およびその他) を入れて、コードをよりきれいに見せるようにしています。

于 2013-01-05T16:44:21.433 に答える