3

最初の UITableViewController で次にクリックすると、2 番目の UITableViewController がナビゲーション スタックにプッシュされ、通常のようにトランジションがアニメーション化されるように、2 つの UITableViewControllers があります。次に押すと、ビューだけがアニメーションし、ナビゲーションバーはアニメーションしません(同じままです)。私は以下のコードでこれを行うことに非常に近づいています:

- (void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    CATransition *navTransition = [CATransition animation];
    navTransition.duration = .5;
    navTransition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    navTransition.type = kCATransitionPush;
    navTransition.subtype = kCATransitionPush;
    [self.navigationController.navigationBar.layer addAnimation:navTransition forKey:nil];

}

このコードを配置し、両方のナビゲーション バーのタイトルとボタンが各 UITableViewController でまったく同じになるようにします。ほとんど動作しますが、問題は、アニメーションが発生するとナビゲーション バーが点滅することです。とにかく点滅しないようにする方法はありますか、またはナビゲーションバーのアニメーションが発生しないようにする他の良い方法はありますか (つまり、レイヤーのアニメーションを無効にするなど)?

更新: 他のアイデアはありますか? これにはまだ苦労しています。

4

3 に答える 3

2

これが私が思いついたものです。シーケンスの最初の viewController のコードは次のとおりです。

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
        if (viewController == self)
        {
                if (self.isInitialized)
                {
                        CATransition *navigationBarAnimation = [CATransition animation];
                        navigationBarAnimation.duration = 1.5;
                        navigationBarAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];;
                        navigationBarAnimation.type = kCATransitionFade;
                        navigationBarAnimation.subtype = kCATransitionFade;
                        navigationBarAnimation.removedOnCompletion = YES;
                        [self.navigationController.navigationBar.layer addAnimation:navigationBarAnimation forKey:nil];
                }
                else 
                {
                        self.isInitialized = YES;
                }
        }
}

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
        if (viewController == self)
        {
                if (self.isInitialized)
                {
                        [self.navigationController.navigationBar.layer removeAllAnimations];
                }
        }
}

2番目のView Controllerのコードは次のとおりです。

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
        if (viewController == self)
        {
                if (!self.isInitialized)
                {
                        CATransition *navigationBarAnimation = [CATransition animation];
                        navigationBarAnimation.duration = 1.5;
                        navigationBarAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];;
                        navigationBarAnimation.type = kCATransitionFade;
                        navigationBarAnimation.subtype = kCATransitionFade;
                        navigationBarAnimation.removedOnCompletion = YES;
                        [self.navigationController.navigationBar.layer addAnimation:navigationBarAnimation forKey:nil];
                        self.isInitialized = YES;
                }
        }
}

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
        if (viewController == self)
        {
                if (self.isInitialized)
                {
                        [self.navigationController.navigationBar.layer removeAllAnimations];
                }
        }
}

UINavigationControllerがいつ表示されているかを把握するには、デリゲート メソッドを使用する必要がありUIViewControllerます。次に、各 について、プロパティを作成して、 がスタックにプッシュされているとき、または次の をプッシュしたために表示されているときを判断できるようにするUIViewController必要があります。BOOL isInitializedUIViewControllerUIViewController

于 2012-01-11T06:11:46.613 に答える
1

これは最良の答え/アイデアではないかもしれませんが、アニメーション中に UINavigationBar をマスクすることはできます。

UINavigationBar現在とまったく同じように見える を作成し、トランジションが行われる直前にUNavigationBar追加し、終了したら削除します。keyWindowこれにより、基本的に のみがカバーされ、UINavigationBarそのアニメーションが非表示になります。

于 2012-01-03T21:52:43.827 に答える