7

私は一日中これを理解しようとしてきましたが、できるはずだとわかっていますが、AppceleratorではなくObjective-Cを使用したiOS開発は初めてなので、初心者の問題があります。

私が達成しようとしているのは、他のビューの 1 つにビューを埋め込むことですが、プログラミングによって埋め込まれているビューを切り替えることができるようにすることです。ストーリーボードを使用しています。ビュー コンテナーを使用しようとすると、アタッチされたビューが表示されますが、ストーリーボードのコンテナーに複数のビューをアタッチできません。画像を作成しましたが、「rep」ポイントが足りないため、ここに画像を投稿できないので、自分のサイトに投稿しました: http://static.c6gx.com/images/iphone -embedded-views-diagram.jpg

後で、そのビュー コンテナー内でプッシュ セグエのように見えるものを希望しますが、最初に埋め込みビュー 1、2、3 などを切り替えることができるようにしたいだけです。ビュー コンテナーを使用して達成することになっていますか?これ、または他のタイプのコントローラーですか?では、どのように遷移を呼び出してビューを変更すればよいでしょうか?

ご協力いただきありがとうございます。

4

3 に答える 3

6

コンテナ ビュー コントローラの場合と同様に、ビュー コントローラを切り替えることができます。コンテナー ビュー (実際には 2 つですが、ここでは 1 つだけを扱います) を追加するプロジェクトを作成し、コンテナー ビューにドラッグすると自動的に取得される組み込みコントローラーにこのコードを追加しました。切り替え先のコントローラー、NewRightController は UIViewController サブクラスです。ストーリーボードで、コントローラーのサイズを「フリーフォーム」に設定し、ビューのサイズを埋め込みコントローラーのビューのサイズと一致するように変更しました。これは実際にはビューのサイズには影響しません (フルスクリーンとして記録されます)。サブビューのレイアウトが簡単になるだけです。

-(IBAction)switchToNewRight:(id)sender {
    UIView *rcView = [(ViewController *)self.parentViewController rightView]; // rcView is the right container view in my root view controller that self is embedded in.
    NewRightController *newRight = [self.storyboard instantiateViewControllerWithIdentifier:@"NewRight"];
    newRight.oldRightController = self; // pass self to new controller so I can come back to the same instance
    newRight.view.frame = rcView.bounds;
    [self.parentViewController addChildViewController:newRight];
    [self moveToNewController:newRight];
}

-(void)moveToNewController:(UIViewController *) newController {
    UIView *rcView = [(ViewController *)self.parentViewController rightView];
    [self willMoveToParentViewController:nil];
    [self.parentViewController transitionFromViewController:self toViewController:newController duration:1 options:UIViewAnimationOptionTransitionCurlUp animations:^{}
         completion:^(BOOL finished) {
             [self removeFromParentViewController];
             [rcView constrainViewEqual:newController.view];
             [newController didMoveToParentViewController:self];
         }];
}

多くの実験の結果、ビューを適切なサイズにし、回転後に適切にサイズ変更する方法は、最初に新しいコントローラーのビューのフレームをコンテナー ビューの境界に設定することでしたが、遷移アニメーションの後に制約を追加することがわかりました。回転直後のサイズを維持する新しいビュー。このコードは繰り返し使用される可能性があるため、UIView のカテゴリに入れ、constrainViewEqual: という 1 つのメソッドを使用します。そのためのコードは次のとおりです。

-(void)constrainViewEqual:(UIView *) view {
    [view setTranslatesAutoresizingMaskIntoConstraints:NO];
    NSLayoutConstraint *con1 = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeCenterX relatedBy:0 toItem:view attribute:NSLayoutAttributeCenterX multiplier:1 constant:0];
    NSLayoutConstraint *con2 = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeCenterY relatedBy:0 toItem:view attribute:NSLayoutAttributeCenterY multiplier:1 constant:0];
    NSLayoutConstraint *con3 = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeWidth relatedBy:0 toItem:view attribute:NSLayoutAttributeWidth multiplier:1 constant:0];
    NSLayoutConstraint *con4 = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeHeight relatedBy:0 toItem:view attribute:NSLayoutAttributeHeight multiplier:1 constant:0];
    NSArray *constraints = @[con1,con2,con3,con4];
    [self addConstraints:constraints];
}
于 2012-11-21T00:10:01.267 に答える
1

それで、たくさん遊んだ後、私はそれを機能させることができました。この時点では遷移はありませんが、他の人が見ることができるようにコードを投稿したいと思いました。

ストーリーボードには、ゲーム全体のビューコントローラがあり、ビューコンテナとボタンがあります。ゲームビューに埋め込まれているビューは、さまざまなタイプの質問を含むページコントローラーです。次に、ストーリーボードに添付されていないのは、さまざまなタイプの質問レイアウトです。私の場合は、teamDisplayとlocationDisplayです。

QuestionViewControllerで、.hファイルに2つのプロパティを追加しました。

@property (nonatomic, strong) UIPageViewController *pageViewController;
@property (nonatomic, strong) NSMutableArray *questionTypeViewControllers;

メソッドを宣言しました:

-(void)changeView;

.mファイルで、それらを合成しました。

@synthesize questionTypeViewControllers,
            pageViewController;

viewDidLoadメソッドの場合:

pageViewController = [[UIPageViewController alloc]
        initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl
        navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal
        options:nil];

UIViewController *ldvc = [self.storyboard instantiateViewControllerWithIdentifier:@"locationDisplay"];
UIViewController *tdvc = [self.storyboard instantiateViewControllerWithIdentifier:@"teamDisplay"];

questionTypeViewControllers = [NSMutableArray arrayWithObjects:ldvc, tdvc, nil];

NSArray *initView = [NSArray arrayWithObject:ldvc];

[pageViewController setViewControllers:initView
                                      direction:UIPageViewControllerNavigationDirectionForward
                                       animated:NO
                                     completion:nil];
[self addChildViewController:pageViewController];
[self.view addSubview:self.pageViewController.view];

次に、changeViewメソッドを実装しました。

NSArray *initView = [NSArray arrayWithObject: [questionTypeViewControllers objectAtIndex:1]];
[pageViewController setViewControllers:initView
                                 direction:UIPageViewControllerNavigationDirectionForward
                                  animated:NO
                                completion:nil];

ボタンが配置されているGameViewControllerで、ボタンにアクションを追加し、QuestionViewControllerから新しく作成されたchangeViewメソッドを呼び出します。

- (IBAction)change:(id)sender {
    // Need a more reliable way to get the QuestionViewController.
    [[self.childViewControllers objectAtIndex:0] changeView];
}

そしてそれだけです。簡単なことではありませんか?!;)

これがこれを行うための適切な方法であるかどうかはわかりませんが、機能しました。提案や改善は大歓迎です。

于 2012-11-21T18:04:11.690 に答える
1

私も同じことをしたかったのですが、これが私が見つけたものです。

カスタム コンテナ ビュー コントローラの作成

その要点は、コンテナー ビューに埋め込むナビゲーション コントローラーを作成することです。これにより、必要に応じて複数のビューをナビゲートできます。

短い例/ウォークスルーを次に示します。

  1. ナビゲーション コントローラーをストーリーボードに追加します。
  2. Container View 内に Navigation Controller を埋め込みます。
  3. ナビゲーション コントローラーのルート ビュー コントローラーにするビューを選択します。
  4. ROOT VIEW CONTROLLERを含む、コンテナビュー内で使用される各View Controllerの手動セグエを作成します(これを追加しないという間違いを犯しました)。作成する各セグエに名前を付けてください。
  5. コードでは、別のView Controllerを表示したいときはいつでも、対応する手動セグエを呼び出すだけです。

お役に立てれば!

于 2013-08-03T14:34:21.440 に答える