8239


`NavigationController`で一つ前の画面に戻るときに画面左上の戻るボタンを押すと画面が左から右にスライドして前の画面に戻りますが、そのスライドのアニメーションをさせないようにするにはどうすればよろしいでしょうか？現在以下のコードを書いて戻るボタンが押された時を検知できるようにし、フェードアウトのアニメーションなどを書いて実行するのですが、どうしてもスライドのアニメーションが表示されてしまいます。画面がフェードアウトしながら横から前の画面が現れるといった具合です。どうすれば戻るボタンが押された時にアニメーションをさせないようにすることができるでしょうか？どなたか分かる方がいれば教えていただきたいです。すみませんが、よろしくお願いします。

[code]

    - (void)viewWillDisappear:(BOOL)animated {
        if ([self.navigationController.viewControllers indexOfObject:self] == NSNotFound) {
    
        }
        [super viewWillDisappear:animated];
    }
    
[/code]

---追記---

![画像の説明をここに入力](https://i.stack.imgur.com/DUREf.png)


CC BY-SA 3.0
2015-03-22T09:13:38.410
8233
2015-03-25T06:31:45.913
2015-03-23T01:53:07.117
5210
5210
question
objective-c uinavigationcontroller
NavigationControllerの戻るボタンが押された時にアニメーションをさせない


手段は一種類でなく、ほかにもあると思いますが、比較的わかりやすく、短いコードで実現できるものを紹介します。  
UINavigationControllerのサブクラスを作り、メソッドpopViewControllerAnimated:をオーバーライドします。Storyboardのスクリーンショットにある、いちばん左側のUINavigationControllerを、下のMyNavigationControllerと置き換えてください。

MyNavigationController.m（.hは、変更がないので省略）

[code]

    #import "MyNavigationController.h"
    
    @interface MyNavigationController ()
    
    @end
    
    @implementation MyNavigationController
    
    - (UIViewController *)popViewControllerAnimated:(BOOL)animated {
        // 既存のトランジションがあったら、全削除。
        [self.view.layer removeAllAnimations];
        // アニメーションが有効だったら、
        if (animated == YES) {
            // フェードアウト、フェードインのトランジションは、Core Animationフレームワークを使う。
            CATransition *transition = [[CATransition alloc] init];
            transition.duration = 0.6;
            transition.type = kCATransitionFade;
            [self.view.layer addAnimation: transition forKey: kCATransition];
        }
        // アニメーションオフにして、スーパークラスのメソッドを呼ぶ。
        return [super popViewControllerAnimated: NO];
    }
    
    @end
    
[/code]

今回はCore
Animationを使いましたが、UIViewのアニメーションで、クロスディゾルブのトランジションを使う方法もあるでしょう。それも同じ手法で処理できます。

## おまけ：

UIViewController（のサブクラス）の遷移先がUINavigationController（あるいはそのサブクラス）とするのは、ある意味を持った編集です。あるNavigationによる画面遷移の流れと、べつのNavigationによる画面遷移の流れを作ることを意味します。いわば、本線のNavigationに対し、支線のNavigationを作るという意味になります。そういう意図で遷移先をUINavigationControllerにしたとき、そのUINavigationControllerのrootViewControllerを作っておかないといけません。


CC BY-SA 3.0
2015-03-22T23:54:54.887
8239
2015-03-23T02:37:13.810
2015-03-23T02:37:13.810
7362
7362
8233
answer


少し手間がかかりそうですがCustom Segueを用意する方法もあるようです。  
参考と自分への備忘録的な意味も兼ねてリンクを貼っておきます。

[Segueを使ってUINavigationControllerの画面遷移アニメーションを変更する](http://qiita.com/roothybrid7/items/532b63175da30fa9a2b1)  
[Storyboard - カスタムSegueとカスタムUnwind Segueの作り方](http://enamelsystems.com/0010/)


CC BY-SA 3.0
2015-03-23T01:32:13.913
8241
2015-03-23T01:32:13.913
3516
8233
answer


画面遷移アニメーションすらしないシンプルなカスタムSegueの例が、Appleのプログラミングガイドに載っていました。

<https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomSegues/CreatingCustomSegues.html#//apple_ref/doc/uid/TP40007457-CH16-SW1>

の一番下のセクションにあります。


CC BY-SA 3.0
2015-03-25T06:31:45.913
8368
2015-03-25T06:31:45.913
7283
8233
answer