9

特定のコントローラーを押したときにナビゲーションバーの背景画像を変更しています。その変化をアニメートしたい。私は次のコードでそうすることができます:

[UIView transitionWithView:self.navigationController.navigationBar
                  duration:0.3f
                   options:UIViewAnimationOptionTransitionCrossDissolve
                animations:^{
    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"now-playing-nav-bar.png"]
                                                 forBarMetrics:UIBarMetricsDefault];
} completion:NULL];

ただし、これにより、navigationBarTitleおよびに適用されるデフォルトのプッシュ アニメーションがブロックされますUIBarButtonItem

背景の変更とプッシュ アニメーションを連携させるにはどうすればよいですか?

私は可能な限りバニラのソリューションを好みます。

PS:tintColor背景にテクスチャがかかっているため使用できません。

4

3 に答える 3

26

iOS 6 でのみテスト済み

Core Animationを使用して解決しました:

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

    CATransition *animation = [CATransition animation];
    animation.duration = 0.3;
    animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    animation.type = kCATransitionFade;

    [self.navigationController.navigationBar.layer addAnimation:animation forKey:nil];

    [UIView animateWithDuration:0.3 animations:^{
        [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"now-playing-nav-bar.png"] forBarMetrics:UIBarMetricsDefault];
    }];
}

で同じviewWillDisappear:ことをすると、準備完了です。

于 2013-02-25T17:18:19.637 に答える
5

これはiOS 9で機能します:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    changeNavigationBackground()
}

func changeNavigationBackground() {
    // navigationBar should always exist if the view controller is in a UINavigationController
    guard let navigationBar = navigationController?.navigationBar else { return }

    // the current navigation background
    guard let imageView = navigationBar.subviews.filter({ $0 is UIImageView }).first else { return }
    let image = UIImage(named: "navigation_background")
    let newImageView = UIImageView(image: image)
    newImageView.frame = imageView.frame
    newImageView.alpha = 0.0
    navigationBar.insertSubview(newImageView, belowSubview: imageView)

    transitionCoordinator()?.animateAlongsideTransition({ (context) in
        imageView.alpha = 0.0
        newImageView.alpha = 1.0
    }, completion: { (context) in
        newImageView.removeFromSuperview()
        navigationBar.setBackgroundImage(image, forBarMetrics: .Default)
        imageView.alpha = 1.0
    })
}

可能であれば Core Animation を避けようとするので、ビューのみを使用し、トランジションに沿ってアルファ値を変更しました。

于 2016-08-21T20:41:08.350 に答える
0

プッシュ アニメーションは遷移アニメーションなしで動作しますか? はいの場合、おそらく、ナビゲーション バーの画像を変更するブロックでプッシュ アニメーションを自分で行う必要があります。

于 2013-01-30T12:04:48.143 に答える