Programing

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

lottogame 2020. 9. 6. 11:52
반응형

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


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

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

모든 것이 완벽하게 작동합니다. 뷰 사이에서 슬라이드 애니메이션을 제거하고 싶습니다.


이 링크를 기반으로 사용자 지정 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

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

여기에 이미지 설명 입력


Ian의 대답은 훌륭합니다!

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

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

}

이제 다음 코드를 사용하여이 작업을 수행했습니다.

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를 사용하여 응답 -

"푸시"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)
    }
}

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 클래스로 설정해야한다는 점을 잊지 마십시오.


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

UIView.performWithoutAnimation { 

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

    }

iOS 7.0에서 사용 가능


I'm using Visual Studio w/ Xamarin, and the designer doesn't provide the "Animates" checkmark in dtochetto's answer.

Note that the XCode designer will apply the following attribute to the segue element in the .storyboard file: animates="NO"

I manually edited the .storyboard file and added animates="NO" to the segue element(s), and it worked for me.

Example:

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

PUSH WITHOUT ANIMATION : Swift Here is what worked for me.

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 : Set the segue class from storyboard as shown in picture. set the isAnimationRequired from your viewcontroller to false from where you want to call performSegue, when you want to push segue without animation and set back to true after calling self.performSegue. Best of luck....

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

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


Just set animated false on UINavigationController.pushViewController in Swift

self.navigationController!.pushViewController(viewController, animated: false)

참고 URL : https://stackoverflow.com/questions/16209113/push-segue-in-xcode-with-no-animation

반응형