Push segue в xcode без анимации


Я использую обычную раскадровку и нажимаю сегменты в xcode, но я хочу, чтобы сегменты просто отображались в следующем представлении, а не скользили в следующем представлении (как при использовании панели вкладок и следующем представлении).

есть ли хороший простой способ, чтобы нормальные push-сегменты просто "появлялись", а не "скользили", без необходимости добавлять пользовательские сегменты?

все работает совершенно нормально, я просто хочу удалить эту анимацию слайдов между представлениями.

11   88  

11 ответов:

я смог сделать это, создав пользовательский сегмент (на основе этой ссылке).

  1. создайте новый класс segue (см. ниже).
  2. откройте раскадровку и выберите segue.
  3. установлен класс PushNoAnimationSegue (или как вы это решили назвать).

Specify segue class in Xcode

Swift 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.м

#import "PushNoAnimationSegue.h"

@implementation PushNoAnimationSegue

- (void)perform {

    [self.sourceViewController.navigationController pushViewController:self.destinationViewController animated:NO];
}

@end

вы можете снять флажок "анимация" в Interface Builder для iOS 9

enter image description here

ответ Яна отлично работает!

вот быстрая версия Segue, если кому-то нужно:

PushNoAnimationSegue.Свифт

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

надеюсь, это поможет кому-то еще!

вот версия 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)
    }

}

для всех, кто использует Xamarin iOS ваш пользовательский класс segue должен выглядеть так:

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

    }

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

Не забывайте, что вам все еще нужно установить пользовательский сегмент в вашей раскадровке и установить класс В класс PushNoAnimationSegue.

ответ Swift3 -

для" push " segue:

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

для меня, самый простой способ сделать это :

UIView.performWithoutAnimation { 

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

    }

доступно с iOS 7.0

Я использую Visual Studio w / Xamarin, и дизайнер не предоставляет галочку "анимирует" в ответе dtochetto.

обратите внимание, что конструктор XCode применит следующий атрибут к элементу segue в поле.раскадровка файла: анимация= "нет"

Я вручную редактировал .раскадровка файла и добавил animates= " NO " к элементу(ам) segue, и это сработало для меня.

пример:

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

PUSH без анимации: 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)
        }
    }
}

использование: установите класс segue из раскадровки, как показано на рисунке. установите isAnimationRequired из вашего viewcontroller в false, откуда вы хотите вызвать performSegue, когда вы хотите нажать segue без анимации и вернуться к true после вызова self.исполняет свою роль. Желаю удачи....

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.

просто набор animatedложные on UINavigationController.pushViewController быстро

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