3

私は、次のように動作するはずのカスタム アニメーション セグエに取り組んでいます。

User taps cell in table view,
table view splits underneath the selected cell,
bottom half translates down, upper half translates up to reveal destination view

残念ながら、ビューを 2 つに分割するのに問題がありました。私のアイデアは、ビューの 2 つのスナップショットを作成し、それらのスナップショットの境界を変更し、1 つは下部を表し、もう 1 つは上部を表し、ビューを下に隠してスナップショットを変換することでした。

ただし、2 つの問題があります。1) ソース ビューがアルファを非表示または変更すると、スナップショットも変更されます (スナップショットを撮影する唯一の方法は、ソース ビューのサブビューにすることであるため)。2) 黒い画面の後、目的地のビューが遅れて表示されます。

問題が何であるかについてのアイデアはありますか?それとも、それを取るための新しい方向ですか?

コードは次のとおりです。

@interface ExpandTableViewSegue()

// there are these also in header
// UIImageView *topView;
// UIImageView *bottomView;

@property (strong, nonatomic) UIView *containerView;
@property (strong, nonatomic) UIViewController *imageContainerViewController;

@property (strong, nonatomic) UIView *backgroundView;

@property (strong, nonatomic) UINavigationController *navigationController;

@end

@implementation ExpandTableViewSegue


- (void)perform {
    self.navigationController = [self.sourceViewController navigationController];

    [self pushDestinationControllerToNavigationStack];
    self.backgroundView = [[self.destinationViewController view] snapshotView];
    [self popTopMostControllerOffStack];

    [self pushImageContainerControllerToNavigationStack];
    [self animateImagesInContainerView];
}

- (void)pushDestinationControllerToNavigationStack {
    [self.navigationController pushViewController:self.destinationViewController animated:NO];
}

- (void)pushImageContainerControllerToNavigationStack {
    UIViewController *imageContainerController = [self imageContainerViewController];

    [self.navigationController pushViewController:imageContainerController animated:NO];
}

- (void)animateImagesInContainerView {
    [UIView animateWithDuration:2.0 delay:0.0 options:UIViewAnimationOptionCurveEaseIn animations:^{

        [[self.sourceViewController view]removeFromSuperview];
        [self translateTopImageUp];
        [self translateBottomImageDown];
        [self.containerView removeFromSuperview];
    }
    completion:^(BOOL finished) {
        if (finished) {
            [self popTopMostControllerOffStack];
            [self pushDestinationControllerToNavigationStack];
        }
    }];
}

EDIT1: (更新されたコード) 最初の問題を解決しました...私がしたことは、両方のスナップショット イメージを格納するコンテナー ビューを作成し、アニメーションを実行する前にそのビューをナビゲーション スタックにプッシュすることでした。しかし、宛先コントローラーがスタックにプッシュされたときに対処する 2 番目の問題にはまだ問題があります。私が欲しいのは、アニメーションが下に目的地のビューを徐々に表示することです。しかし、現在は黒い画面 (現在のビュー) が表示され、目的のビューにポップされます。

私が試みた解決策は、目的のビューをスタックにすばやくプッシュし、スナップショットを取得して、スタックからポップすることでした。その後、手順を続行しますが、新しいスナップショットをバックグラウンドに追加して、最初の 2 つのスナップショットの背後に表示されるようにします。

新しいアイデアはありますか?ありがとう!

4

1 に答える 1