私は通常のストーリーボードを使用しており、xcodeでセグエをプッシュしていますが、次のビューをスライドせずに、次のビューだけを表示するセグエを使用したいと思います(タブバーを使用して次のビューを表示するときのように)。
カスタムセグエを追加せずに、通常のプッシュセグエを「スライド」ではなく「表示」する簡単な方法はありますか?
すべてが完全に正常に機能しています。ビュー間のスライドアニメーションを削除したいだけです。
私は通常のストーリーボードを使用しており、xcodeでセグエをプッシュしていますが、次のビューをスライドせずに、次のビューだけを表示するセグエを使用したいと思います(タブバーを使用して次のビューを表示するときのように)。
カスタムセグエを追加せずに、通常のプッシュセグエを「スライド」ではなく「表示」する簡単な方法はありますか?
すべてが完全に正常に機能しています。ビュー間のスライドアニメーションを削除したいだけです。
回答:
(このリンクに基づいて)カスタムセグエを作成することで、これを行うことができました。
PushNoAnimationSegue
(または、あなたがそれを呼び出すことに決めたもの)に設定します。import UIKit
/*
Move to the next screen without an animation.
*/
class PushNoAnimationSegue: UIStoryboardSegue {
override func perform() {
self.source.navigationController?.pushViewController(self.destination, animated: false)
}
}
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
Identifier
名前を付けます。
イアンの答えは素晴らしいです!
誰かが必要な場合、ここにセグエのスウィフトバージョンがあります:
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)
}
}
これで、次のコードを使用してこれを行うことができました。
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];
これが誰かを助けることを願っています!
以下は、アニメーションなしで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)
}
}
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)
}
}
Xamarin iOSを使用している場合、カスタムセグエクラスは次のようにする必要があります。
[Register ("PushNoAnimationSegue")]
public class PushNoAnimationSegue : UIStoryboardSegue
{
public PushNoAnimationSegue(IntPtr handle) : base (handle)
{
}
public override void Perform ()
{
SourceViewController.NavigationController.PushViewController (DestinationViewController, false);
}
}
ストーリーボードでカスタムセグエを設定し、クラスをPushNoAnimationSegueクラスに設定する必要があることを忘れないでください。
私にとって、これを行う最も簡単な方法は次のとおりです。
UIView.performWithoutAnimation {
self.performSegueWithIdentifier("yourSegueIdentifier", sender: nil)
}
iOS 7.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"/>
アニメーションなしでプッシュ: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
}