私は、次のように動作するはずのカスタム アニメーション セグエに取り組んでいます。
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 つのスナップショットの背後に表示されるようにします。
新しいアイデアはありますか?ありがとう!