アニメーションなしでxcodeでセグエをプッシュ


90

私は通常のストーリーボードを使用しており、xcodeでセグエをプッシュしていますが、次のビューをスライドせずに、次のビューだけを表示するセグエを使用したいと思います(タブバーを使用して次のビューを表示するときのように)。

カスタムセグエを追加せずに、通常のプッシュセグエを「スライド」ではなく「表示」する簡単な方法はありますか?

すべてが完全に正常に機能しています。ビュー間のスライドアニメーションを削除したいだけです。


アニメーションを削除できるように、プッシュセグエをモーダルセグエに変更しようとしましたが、トップツールバーのあるテーブルビューがあり、セグエをモーダルに設定すると、このトップバーが削除され、方法を見つけることができません。トップバーを元に戻します!したがって、遷移をアニメーション化しないが、テーブルビューを壊さないソリューションが必要です。
リチャード

回答:


143

このリンクに基づいて)カスタムセグエを作成することで、これを行うことができました。

  1. 新しいセグエクラスを作成します(以下を参照)。
  2. ストーリーボードを開き、セグエを選択します。
  3. クラスをPushNoAnimationSegue(または、あなたがそれを呼び出すことに決めたもの)に設定します。

Xcodeでセグエクラスを指定する

スウィフト4

import UIKit

/*
 Move to the next screen without an animation.
 */
class PushNoAnimationSegue: UIStoryboardSegue {

    override func perform() {
        self.source.navigationController?.pushViewController(self.destination, animated: false)
    }
}

目的C

PushNoAnimationSegue.h

#import <UIKit/UIKit.h>

/*
 Move to the next screen without an animation.
 */
@interface PushNoAnimationSegue : UIStoryboardSegue

@end

PushNoAnimationSegue.m

#import "PushNoAnimationSegue.h"

@implementation PushNoAnimationSegue

- (void)perform {

    [self.sourceViewController.navigationController pushViewController:self.destinationViewController animated:NO];
}

@end

コメントと入力をありがとう。
リチャード、

11
ベストアンサー。バックアニメーションで同じことを達成するためのアイデアはありますか?
トーマス

1
魅力のように機能します。これは、ストーリーボードセグエでこれを行う「正しい」方法でもあります。
Jeff Richley、

1
上記の答えの誰かがバックアニメーションを止めましたか?
イムラン2014

4
ソリューションではなく、カスタムセグエはレイアウト全体にモーダルプッシュのように表示されますが、元のプッシュセグエはwindow.frame navigationController tabBarControllerなどを尊重します...モーダルセグエのようにではなくプッシュセグエのように動作するようにセグエを構成するには?または... $ 1.000.000の質問、STORYBOARDSを使用して通常のセグエを構成する場合、animations = NOをどのように指定しますか
Pedro Borges

49

iOS 9のInterface Builderで「アニメーション」のチェックを外すことができます

ここに画像の説明を入力してください


3
これが元の質問に対する答えです!他の回答は、objc / swiftコードでこれを達成する方法を示していますが、dtochettoは(元の質問で要求されたように)Xcodeのみを使用しています。
drpawelo 2015年

ただし、リラックスしたセグエでは機能しないようです
Nicolas Manzini、2015年

2
これは、残念ながら、これはiOSの8で動作しない、最善かつ迅速なソリューションです
EricH206

2
@DanielT。おそらく、ストーリーボードに2つのセグエをドラッグできます。1つにはアニメーションがあり、もう1つにはアニメーションがありません。それらに別のIdentifier名前を付けます。
AechoLiu

1
XCodeが.storyboardファイルのsegue要素に属性を追加するだけであることに注意してください。.storyboardファイルを手動で編集し、ビジュアルスタジオを使用していてデザイナーでチェックマークを使用できない場合に気にするセグエにanimates = "NO"を追加できます。
ウェス・

35

イアンの答えは素晴らしいです!

誰かが必要な場合、ここにセグエのスウィフトバージョンがあります:

SWIFT 5、2020年5月に更新

PushNoAnimationSegue.swift

import UIKit

/// Move to the next screen without an animation
class PushNoAnimationSegue: UIStoryboardSegue {
override func perform() {
    if let navigation = source.navigationController {
        navigation.pushViewController(destination as UIViewController, animated: false)
    }
}

2
おそらくSwiftのバージョンが原因で、私は「as!」が必要でした 使用する2つの場所で「として」の代わりに。
Carlos

1
多分Swift 1.2で?Xcode 7 Beta1のSwift 2.0で確認したところ、警告なしでコンパイルされました。
zavié

6

これで、次のコードを使用してこれを行うことができました。

CreditsViewController *creditspage = [self.storyboard instantiateViewControllerWithIdentifier:@"Credits"];
[UIView beginAnimations:@"flipping view" context:nil];
[UIView setAnimationDuration:0.75];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.navigationController.view cache:YES];
[self.navigationController pushViewController:creditspage animated:NO];
[UIView commitAnimations];

これが誰かを助けることを願っています!


これをUIButtonなどのアクションに追加できます。アニメーションのない新しいビューコントローラーにジャンプする場合は、次を使用できます。-void(yourUIButtonAction){CreditsViewController * creditspage = [self.storyboard instantiateViewControllerWithIdentifier:@ "Credits"]; [self.navigationController pushViewController:creditspage animated:NO]; }
リチャード

これは質問に答えることすらできません。ここではセグエを使用していません!
KIDdAe 2017

4

以下は、アニメーションなしでViewController をモーダルに表示するように適合されたSwiftバージョンです。

import UIKit

/// Present the next screen without an animation.
class ModalNoAnimationSegue: UIStoryboardSegue {

    override func perform() {
        self.sourceViewController.presentViewController(
            self.destinationViewController as! UIViewController,
            animated: false,
            completion: nil)
    }

}

1
このコードは@zaviéの回答からコピーされたもので、何も追加されていませんが、実際にはさらに悪いです。オプションのチェックは含まれていません
Diego Freniche

これは@zaviéの回答とは異なります。アニメーションなしでViewController をモーダルに表示する方法を示しているためです。質問と多少関係があるため、参照としてここに用意してください。
n.Drake

2

Swift3を使用して回答 -

「プッシュ」セグエの場合:

class PushNoAnimationSegue: UIStoryboardSegue
{
    override func perform()
    {
       source.navigationController?.pushViewController(destination, animated: false)
    }
}

「モーダル」セグエの場合:

class ModalNoAnimationSegue: UIStoryboardSegue
{
    override func perform() {
        self.source.present(destination, animated: false, completion: nil)
    }
}

1

Xamarin iOSを使用している場合、カスタムセグエクラスは次のようにする必要があります。

[Register ("PushNoAnimationSegue")]
public class PushNoAnimationSegue : UIStoryboardSegue
{
    public PushNoAnimationSegue(IntPtr handle) : base (handle)
    {

    }

    public override void Perform ()
    {
        SourceViewController.NavigationController.PushViewController (DestinationViewController, false);
    }
}

ストーリーボードでカスタムセグエを設定し、クラスをPushNoAnimationSegueクラスに設定する必要があることを忘れないでください。


0

私にとって、これを行う最も簡単な方法は次のとおりです。

UIView.performWithoutAnimation { 

        self.performSegueWithIdentifier("yourSegueIdentifier", sender: nil)

    }

iOS 7.0から利用可能


アダプティブセグエを使用している場合、performWithoutAnimationはアニメーションを無効に設定しますが、セグエが実行される前に、セグエに "animates"がチェックされている場合、アニメーションは再度有効になります。ただし、実行後は、以前は無効にされていましたが、再び無効にされました。
Malhal

しかし、UIStoryboardSegueサブクラスを作成し、実行前にアニメーションを再び無効にすることで回避できます(たとえば、コンストラクターを使用して無効になっているかどうかを確認し、プロパティに保存するなど)。
Malhal

0

XamarinでVisual Studioを使用していますが、デザイナーがdtochettoの回答に「アニメーション」チェックマークを付けていません。

XCodeデザイナーは、.storyboardファイルのsegue要素に次の属性を適用することに注意してください:animates = "NO"

手動で.storyboardファイルを編集し、segue要素にanimates = "NO"を追加しましたが、うまくいきました。

例:

 <segue id="1234" destination="ZB0-vP-ctU" kind="modal" modalTransitionStyle="crossDissolve" animates="NO" identifier="screen1ToScreen2"/>

0

アニメーションなしでプッシュ:Swiftこれ が私にとってうまくいったものです。

import ObjectiveC

private var AssociatedObjectHandle: UInt8 = 0
    extension UIViewController {

        var isAnimationRequired:Bool {
            get {
        return (objc_getAssociatedObject(self, &AssociatedObjectHandle) as? Bool) ?? true
            }
            set {
                objc_setAssociatedObject(self, &AssociatedObjectHandle, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
            }
        }
    }

    -------------------- SilencePushSegue --------------------

class SilencePushSegue: UIStoryboardSegue {

    override func perform() {
        if self.source.isAnimationRequired == false {
            self.source.navigationController?.pushViewController(self.destination, animated: false)
        }else{
            self.source.navigationController?.pushViewController(self.destination, animated: true)
        }
    }
}

使用法:図に示すように、ストーリーボードからセグエクラスを設定します。アニメーションなしでセグエをプッシュし、self.performSegueを呼び出した後でtrueに戻す場合は、performSegueを呼び出す場所から、ビューコントローラーのisAnimationRequiredをfalseに設定します。幸運を祈ります。

DispatchQueue.main.async {
                self.isAnimationRequired = false
                self.performSegue(withIdentifier: "showAllOrders", sender: self);
                self.isAnimationRequired = true
            }

写真に示すように、ストーリーボードからセグエクラスを設定します。


-1

Swiftでanimated falseをオンUINavigationController.pushViewControllerに設定するだけ

self.navigationController!.pushViewController(viewController, animated: false)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.