애니메이션없이 xcode에서 segue 푸시


90

저는 일반 스토리 보드를 사용하고 xcode에서 segues를 푸시하지만 다음보기를 슬라이드하지 않고 다음보기 만 표시하는 segue를 원합니다 (탭 막대를 사용하고 다음보기가 방금 나타날 때와 같이).

사용자 지정 segue를 추가 할 필요없이 일반 푸시 segues가 "slide"가 아닌 "appear"만 표시되도록하는 좋은 간단한 방법이 있습니까?

모든 것이 완벽하게 잘 작동합니다.보기 사이의 슬라이드 애니메이션을 제거하고 싶습니다.


애니메이션을 제거 할 수 있도록 푸시 세그를 모달 세그로 변경하려고 시도했지만 상단 도구 모음이있는 테이블 뷰가 있고 세그를 모달로 설정하면이 상단 바가 제거되고 방법을 찾을 수 없습니다. 다시 상단 바를 추가합니다! 따라서 전환을 애니메이션하지 않지만 테이블 뷰를 깨지 않는 솔루션이 필요합니다.
Richard

답변:


143

이 링크를 기반으로 사용자 지정 segue를 생성하여이를 수행 할 수있었습니다 .

  1. 새 segue 클래스를 만듭니다 (아래 참조).
  2. 스토리 보드를 열고 segue를 선택합니다.
  3. 클래스를 PushNoAnimationSegue(또는 당신이 부르기로 결정한 것)으로 설정하십시오.

Xcode에서 segue 클래스 지정

스위프트 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

의견과 의견에 감사드립니다.
Richard

11
최고의 답변입니다. 백 애니메이션에 대해 동일한 것을 달성하는 것에 대한 아이디어가 있습니까?
Thomas

1
매력처럼 작동합니다. 이것은 또한 스토리 보드 segues를 사용하는 "올바른"방법입니다.
Jeff Richley 2013

1
위의 답변에 대해 뒤로 애니메이션을 중지 한 사람이 있습니까?
Imran

4
해결책이 아닌 사용자 정의 segue는 모달 푸시처럼 전체 레이아웃에 표시되는 반면 원래 푸시 segue는 window.frame navigationController tabBarController 등을 존중합니다. ? 나 ... 하나의 애니메이션을 지정 않습니다 어떻게 $ 1.000.000 질문 = NO 스토리 보드를 사용하여 일반 SEGUE 구성 할 때
페드로 보르헤스

49

iOS 9 용 인터페이스 빌더에서 "애니메이션"을 선택 취소 할 수 있습니다.

여기에 이미지 설명 입력


3
이것이 원래 질문에 대한 답입니다! 다른 답변은 objc / swift 코드에서 이것을 달성하는 방법을 보여 주지만 dtochetto는 원래 질문에서 요청한 것처럼 Xcode 만 사용합니다.
drpawelo

그러나 언 와인드 SEGUE 것이 작동하는 것 같다되지 않습니다
니콜라스 만지니

2
이것은 불행하게도이 아이폰 OS 8에서 작동하지 않습니다, 최고의 빠른 해결책이다
EricH206

2
@DanielT. 아마도 스토리 보드에서 2 개의 segue를 드래그 할 수 있습니다. 하나는 애니메이션이 있고 다른 하나는 애니메이션이 없습니다. 다른 Identifier이름을 지정하십시오.
AechoLiu

1
XCode는 .storyboard 파일의 segue 요소에 속성을 추가합니다. .storyboard 파일을 수동으로 편집하고 Visual Studio를 사용하고 있고 디자이너에서 확인 표시를 사용할 수없는 경우 관심있는 세그먼트에 animates = "NO"를 추가 할 수 있습니다.
Wes

35

Ian의 대답은 훌륭합니다!

누군가 필요하다면 다음은 Segue의 Swift 버전입니다.

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!"가 필요했습니다. 두 곳에서 "as"대신 사용합니다.
Carlos

1
흠 아마도 Swift 1.2에서? Xcode 7 Beta1에서 Swift 2.0으로 확인했고 경고없이 컴파일되었습니다.
zavié 2015-06-16

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

이것은 질문에 대한 답도 아닙니다. 여기서 segue를 사용하고 있지 않습니다!
KIDdAe

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

이것은 애니메이션없이 ViewController 를 모달로 표시하는 방법을 보여주기 때문에 @ zavié의 답변과 다릅니다 . 질문과 다소 관련이 있으므로 여기에 참조로 사용하는 것이 좋습니다.
n.Drake

2

Swift3를 사용하여 응답 -

"푸시"segue의 경우 :

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

"모달"segue의 경우 :

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

1

Xamarin iOS를 사용하는 모든 사용자의 경우 사용자 지정 segue 클래스는 다음과 같아야합니다.

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

    }

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

스토리 보드에서 사용자 지정 segue를 설정하고 클래스를 PushNoAnimationSegue 클래스로 설정해야한다는 점을 잊지 마십시오.


0

저에게 가장 쉬운 방법은 다음과 같습니다.

UIView.performWithoutAnimation { 

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

    }

iOS 7.0에서 사용 가능


적응 형 segue를 사용하는 경우 performWithoutAnimation이 애니메이션을 비활성화하더라도 segue가 수행되기 전에 segue에 "animates"가 체크되어 있으면 애니메이션이 다시 활성화됩니다. 그러나 수행 후 이전에 있던 경우 다시 비활성화됩니다.
malhal '1911.20

그러나 UIStoryboardSegue 하위 클래스를 만들고 공연 전에 애니메이션을 다시 비활성화하여 문제를 해결할 수 있습니다 (예 : 생성자를 사용하여 비활성화되었는지 확인하고 속성에 저장).
malhal

0

Xamarin과 함께 Visual Studio를 사용하고 있으며 디자이너가 dtochetto의 답변에 "Animates"확인 표시를 제공하지 않습니다.

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

애니메이션없이 푸시 : 스위프트 여기 저에게 효과적 이었습니다.

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

사용법 : 그림과 같이 스토리 보드에서 segue 클래스를 설정합니다. 애니메이션없이 segue를 푸시하고 self.performSegue를 호출 한 후 다시 true로 설정하려면 viewcontroller에서 isAnimationRequired를 performSegue를 호출하려는 위치에서 false로 설정합니다. 행운을 빕니다....

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

그림과 같이 스토리 보드에서 segue 클래스를 설정합니다.


-1

Swift에서 animated false 로 설정하십시오.UINavigationController.pushViewController

self.navigationController!.pushViewController(viewController, animated: false)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.