web-dev-qa-db-ja.com

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

私はXcodeで通常のストーリーボードとプッシュセグエを使用していますが、次のビューをスライドさせるのではなく、次のビューに表示するセグエを持ちたいです(タブバーを使用して次のビューが表示されるように)。

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

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

88
Richard

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

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];

これが他の人の助けになることを願っています!

6
Richard

これを行うには、カスタムセグエを作成しました( this link に基づいています)。

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

Specify segue class in 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
141
Ian

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

enter image description here

48
dtochetto

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

Swift Segueのバージョンです。誰かが必要な場合:

PushNoAnimationSegue.Swift

import UIKit

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

    override func perform() {
        let source = sourceViewController as UIViewController
        if let navigation = source.navigationController {
            navigation.pushViewController(destinationViewController as UIViewController, animated: false)
        }
    }

}
35
zavié

Swiftに適応したバージョンモーダルに存在するアニメーションなしのViewController:

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)
    }

}
4
Daniel McLean

Swift-を使用して回答

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

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)
    }
}
2
elkorb

Xamarin iOSを使用する場合、カスタムセグエクラスは次のようになります。

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

    }

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

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

1
JacobK

私にとって、そうする最も簡単な方法は次のとおりです。

UIView.performWithoutAnimation { 

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

    }

IOS 7.0から利用可能

0
LironXYZ

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

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

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

例:

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

アニメーションなしでプッシュ: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)
        }
    }
}

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

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

set the segue class from storyboard as shown in picture.

0
Usman