25

アプリにカスタムの 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];

何が恋しいですか?

4

4 に答える 4

5

bottomLayoutGuideプロパティが長さゼロに設定され、タブバーの上のボタンが自動レイアウトでタブバーの下に落ちるという問題がありました。

これを行うのを見ましたか

[self.navigationController.view setNeedsLayout]

私はそれを私のものに入れ、プロパティviewwillappearの長さがゼロになるのをやめました。多分それはあなたの財産でもbottomLayoutGuideあなたを助けるでしょう。topLayoutGuide

于 2014-04-21T02:32:07.897 に答える
0

私は方法を発見しました。ナビゲーションバーが暗い色になった後、最初にコントローラーの「エッジの拡張」プロパティのチェックを外します。コントローラーにビューを追加し、上下の LayoutConstraint -100 を設定します。次に、ビューのclipsubview プロパティを noにします(navigaionbar の半透明効果のため)。私の英語は下手ですごめんなさい。:)

于 2014-06-21T10:43:48.053 に答える
0

次のビュー階層を使用して、これを回避できました。

UIView
 UIScrollView
  <content, constrained to UIScrollView>

上端、前端、後端、および下端UIScrollViewが一致するように を拘束します。UIView'sInterface Builder では、 に topLayoutGuide と bottomLayoutGuide を使用する必要がある場合と、UIScrollViewそうでない場合があります。Xcode のバージョンにもよるかもしれませんが、一部のビュー コントローラーはスーパービューを使用し、他のビュー コントローラーはレイアウト ガイドを使用しました。

Interface Builder がそのスーパービューに対してスクロール ビューを制約したくないビューについては、テキスト エディターでストーリーボードを開き、手動でスクロール ビューの制約を調整しました。

最後に、ビュー コントローラーで、トップ バーの下のエッジの拡張が YES であること、およびスクロール ビュー インセットの調整が YES であることを確認します。

基本的に、私は topLayoutGuide の使用を避けており、代わりにスクロール ビューのインセットに依存しています。

あなたのように、階層に UIScrollView がなかった場合、トップバーの下のエッジを拡張しないことは私にとってはうまくいきました。

于 2013-11-18T18:38:53.230 に答える