저는 일반 스토리 보드를 사용하고 xcode에서 segues를 푸시하지만 다음보기를 슬라이드하지 않고 다음보기 만 표시하는 segue를 원합니다 (탭 막대를 사용하고 다음보기가 방금 나타날 때와 같이).
사용자 지정 segue를 추가 할 필요없이 일반 푸시 segues가 "slide"가 아닌 "appear"만 표시되도록하는 좋은 간단한 방법이 있습니까?
모든 것이 완벽하게 잘 작동합니다.보기 사이의 슬라이드 애니메이션을 제거하고 싶습니다.
저는 일반 스토리 보드를 사용하고 xcode에서 segues를 푸시하지만 다음보기를 슬라이드하지 않고 다음보기 만 표시하는 segue를 원합니다 (탭 막대를 사용하고 다음보기가 방금 나타날 때와 같이).
사용자 지정 segue를 추가 할 필요없이 일반 푸시 segues가 "slide"가 아닌 "appear"만 표시되도록하는 좋은 간단한 방법이 있습니까?
모든 것이 완벽하게 잘 작동합니다.보기 사이의 슬라이드 애니메이션을 제거하고 싶습니다.
답변:
이 링크를 기반으로 사용자 지정 segue를 생성하여이를 수행 할 수있었습니다 .
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
이름을 지정하십시오.
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)
}
}
이제 다음 코드를 사용하여이 작업을 수행했습니다.
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에서 사용 가능
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"/>
애니메이션없이 푸시 : 스위프트 여기 저에게 효과적 이었습니다.
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
}