アプリにカスタムの UIViewController Transition を実装しました。これは、プッシュ アニメーションに組み込まれているナビゲーション コントローラーを置き換えます。
新しいView Controllerは古いView Controllerからナビゲーションバーを継承していますが、新しくプッシュされたView Controllerのtoplayoutguideが0であることを除いて、これまでのところすべてが機能しています。64.0 (ステータスバーの高さ + ナビゲーション バーの高さ) になるはずですが、現在は 0.0 です。そのため、ストーリーボードの一番上のレイアウト ガイドに関連付けられているすべてのオブジェクトが 64 ポイント高すぎます (半透明のバーの下)。
カスタム ビュー トランジションを無効にすると、上部のレイアウト ガイドに期待される値が表示されます。私はlayoutSubviewsとupdateConstraintsを「いたるところに」呼び出そうとしました。ビューコントローラーとナビゲーションコントローラーで。
私が理解しているように、navigationController (parentviewcontroller) は新しいビュー コントローラーの toplayoutguide を更新する必要がありますが、どうやらカスタム遷移コードに何かが欠けているため、toplayoutguide の正しい値への更新がトリガーされます。
これは、ナビゲーションコントローラーのデリゲートとして設定されたオブジェクトである私のカスタムトランジションコードです:
- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext
{
return 0.7;
}
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
UIView *animationContainerView = [transitionContext containerView];
UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
UIView *toView = [toVC view];
UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIView *fromView = [fromVC view];
CGRect endFrame = [transitionContext finalFrameForViewController:toVC];
CGRect startFrame;
startFrame = CGRectOffset(endFrame, 0, endFrame.size.height);
if (self.operation == UINavigationControllerOperationPop) {
[animationContainerView insertSubview:toView belowSubview:fromView];
[toView setFrame:endFrame];
}
else{
[toView setFrame:startFrame];
[animationContainerView insertSubview:toView aboveSubview:fromView];
}
[UIView animateWithDuration:[self transitionDuration:transitionContext] delay:0.0 usingSpringWithDamping:0.7 initialSpringVelocity:0.8 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
if (self.operation == UINavigationControllerOperationPop) {
[fromView setFrame:startFrame];
[fromView layoutIfNeeded];
}
else{
[toView setFrame:endFrame];
[toView layoutIfNeeded];
}
} completion:^(BOOL finished) {
[transitionContext completeTransition:YES];
}];
}
そこでは本当に素晴らしいことは何も起こりません。組み込みのダイナミクスを使用して、ビューを下から上にスライドさせるだけです。
問題は、トップ レイアウト ガイドの長さ == 0 であるため、トップ レイアウト ガイドにアタッチされたオブジェクトがナビゲーション バーの下にあることです。
ビューコントローラーの toplayoutguide が正しい値に設定されるように、何をする必要があるのか わかりません。
プッシュ ナビゲーションは、プッシュ ストーリーボード セグエを使用して「プレーン バニラ」で実行されます。performSegueWithIdentifier を呼び出す前に、navigationcontrollers デリゲートを設定するだけです。
コードは次のとおりです。
self.navigationController.delegate = [[My_CustomNavigationTransitionDelegate alloc] init];
[self performSegueWithIdentifier:@"infosSegue" sender:nil];
何が恋しいですか?