7

とに問題がtransitionWithViewありanimateWithDurationます。私のanimateWithDurationブロックの1つは移行せず、突然の変更であり、transitionWithViewユーザーの操作を一時的に無効にしません。ドキュメントを確認し、すべてが正しく行われていると信じていますが、明らかに何かが間違っています。コードの2つのブロックは次のとおりです。

ViewControllerこれは、 3つのコンテナビュー/子ビューコントローラを持つメインのビューコントローラにあります。ViewControllerこのブロックは、コンテナビューの1つを移動しますが、遷移が発生している間、ユーザーが他のインタラクションをブロックすることはありません。

[UIView transitionWithView:self.view duration:0.5 options:UIViewAnimationOptionCurveEaseOut animations:^ {
        CGRect frame = _containerView.frame;
        frame.origin.y = self.view.frame.size.height - _containerView.frame.size.height;
        _containerView.frame = frame;
}completion:^(BOOL finished) {
     // do something   
}];

これは私のコンテナビューコントローラの1つにあります。のテキストとしては効果がないようで、アニメーションブロックが存在しないかのように急に変化しますproductTitleLabelproductDescriptionTextView

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{    
    [self.viewController toggleFlavoredOliveOilsTableView];

    if (indexPath.row > 0) {
        NSDictionary *selectedCellDict = [[_flavoredOliveOilsDict objectForKey:@"Unflavored Olive Oils"] objectAtIndex:indexPath.row - 1];

        [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^ {
            self.viewController.productTitleLabel.text = [_flavoredOliveOilsTableView cellForRowAtIndexPath:indexPath].textLabel.text;
            self.viewController.productDescriptionTextView.text = [selectedCellDict objectForKey:@"Description"];
        }completion:nil];

        if (indexPath.row == 1) {
            [self.viewController setProductDescriptionTextViewFrameForInformationTab];
        }
        else {
            [self.viewController setProductDescriptionTextViewFrameForNonInformationTab];

            //self.viewController.productImageView.image = [UIImage imageNamed:[selectedCellDict objectForKey:@"Image"]];
        }
    }
}

私のアニメーションとトランジションブロックのほとんどが期待どおりに完全に機能しないため、問題はある程度関連していると思います。助けてくれてありがとう。

編集

私が達成しようとしているのは、コンテナビューを移動してViewController、ラベル、テキストビュー、および画像ビューのテキストと画像のプロパティを設定することです。これらはすべてメインビューにあります。これらのプロパティの詳細は、子ViewControllerを介して送信されます。はtransitionWithView、で呼び出されるというメソッドtoggleFlavoredOiveOilsTableView内にありdidSelectRowAtIndexPathます。問題は、2つの異なるアニメーション/トランジションブロックを同時に呼び出そうとしていることだと思います。

4

1 に答える 1

13

アニメーションを実行している別のビューのサブビューで1つのアニメーションを実行すると、2つのアニメーションが互いに干渉するというこの動作を体験できます。したがって、transitionWithView:self.viewコードスニペットが示唆するように(つまりメインビューで)実行すると、問題が発生する可能性があります。別個のサブビューで2つのアニメーションを実行すると、問題が解決する場合があります。以下の私の元の答えでは、私は:

  • 2つのコントロールtransitionWithViewを持つサブビューで実行します。UILabel

  • ビューコントローラの包含子ビューをメインビューのサブビュー内に配置すると、transitionFromViewControllerはそのサブビューに制限されます。

2つのアニメーション部分を別々のサブビューに配置すると、アニメーションは問題なく同時に実行できます。


2つのテキストラベルの内容の変更をアニメーション化する場合は、次のことができます。

[UIView transitionWithView:self.viewController.textLabelsContainerView
                  duration:0.5
                   options:UIViewAnimationOptionTransitionCrossDissolve
                animations:^{
                    self.viewController.productTitleLabel.text = [_flavoredOliveOilsTableView cellForRowAtIndexPath:indexPath].textLabel.text;
                    self.viewController.productDescriptionTextView.text = [selectedCellDict objectForKey:@"Description"];
                }
                completion:nil];

通常はを使用animateWithDurationしますが、text属性はアニメーション化可能なプロパティではないため、を使用しtransitionWithView、これらのテキストフィールドのコンテナがあることを確認します。animateWithDurationしかし、子コントローラーの変更を同時にアニメーション化しながら、を使用して他のコントロールをアニメーション化しようとしましたが、正常に機能します。

子ビューコントローラーを移行するためtransitionFromViewControllerに、コンテナーの子コントローラーのビューのスワッピングをアニメーション化するために使用します(これは、カスタムコンテナーファミリーのメソッドの子ビューコントローラーの管理の一部です)。そのプロセスを容易にするために、メインビューコントローラーのビューにコンテナービューを配置し、そのコンテナーのサブビューとして子コントローラーのビューを追加します。そうすれば、子のトランジションをアニメーション化するときに、アニメーションはそのコンテナビューにうまく制限されます。

したがって、ビューコントローラーをコンテナービューに追加するためのサンプルコードと、セグメント化されたボタンを使用して2つの子ビューコントローラー間を移行するために使用するコードを次に示します。

- (void)addFirstChild
{
    UIViewController *child = [self.storyboard instantiateViewControllerWithIdentifier:@"Stooge"];
    [self addChildViewController:child];

    child.view.frame = self.bottomContainerView.bounds;
    [self.bottomContainerView addSubview:child.view];

    [child didMoveToParentViewController:self];
}

- (void)changedChild
{
    UIViewController *oldController = [self.childViewControllers lastObject];
    UIViewController *newController;

    if (self.segmentedControl.selectedSegmentIndex == 0)
        newController = [self.storyboard instantiateViewControllerWithIdentifier:@"Stooge"];
    else
        newController = [self.storyboard instantiateViewControllerWithIdentifier:@"Marx"];

    [oldController willMoveToParentViewController:nil];
    [self addChildViewController:newController];

    // start off screen below

    CGRect startFrame = self.bottomContainerView.bounds;
    startFrame.origin.y += startFrame.size.height;

    // end up where it's supposed to be, right in the container

    newController.view.frame = startFrame;

    [self transitionFromViewController:oldController
                      toViewController:newController
                              duration:0.5
                               options:0
                            animations:^{
                                newController.view.frame = self.bottomContainerView.bounds;
                            }
                            completion:^(BOOL finished) {
                                [oldController removeFromParentViewController];
                                [newController didMoveToParentViewController:self];
                            }];

}

結論として、コンテナの子コントローラと親コントローラのフィールドの両方をアニメーション化することに問題はありません。おそらく私はあなたが説明している問題を理解していません。あるいは、アニメーションの方法の違いについて微妙なことがあるかもしれません。必要に応じて、上記のコードをgithubに配置しました。

于 2012-12-14T21:57:59.163 に答える