Натисніть segue у xcode без анімації


90

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

Чи є хороший простий спосіб, щоб звичайні натискання просто "з'являлися", а не "ковзали", без необхідності додавати власні сегменти?

Все працює повністю нормально, я просто хочу видалити цю анімацію слайдів між переглядами.


Я щойно намагався змінити push-сегмент на модальний сегмент, оскільки це може дозволити мені видалити анімацію, але у мене є табличний перегляд з верхньою панеллю інструментів, і встановлення segue-модального видаляє цю верхню панель, і я не можу знайти жодного способу щоб додати верхню панель назад! Отже, мені потрібне рішення, яке не оживляє перехід, але не порушує мого подання таблиці.
Річард,

Відповіді:


143

Я зміг це зробити, створивши власну команду (на основі цього посилання ).

  1. Створіть новий клас segue (див. Нижче).
  2. Відкрийте свою Раскадровку та виберіть сегу.
  3. Встановіть для класу PushNoAnimationSegue(або як ви вирішили його назвати).

Вкажіть клас segue у Xcode

Стрімкий 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)
    }
}

Завдання С

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

Дякуємо за коментар та введення.
Річард

11
Краща відповідь. Будь-які ідеї щодо досягнення такого ж для бек-анімації?
Томас

1
Працює як шарм. Це також "правильний" спосіб зробити це за допомогою сюжетних сюжетів.
Jeff Richley

1
Хтось зупинив задню анімацію для наведеної вище відповіді.
Імран

4
Не РІШЕННЯ, користувацький segue представлений у всьому макеті так само, як модальний push, тоді як оригінальний push segue відзначає вікно. Frame frameController tabBarController тощо ... як налаштувати segue на поведінку як push push, а не як модальний segue ? або ... питання на 1 000 000 доларів, як вказувати анімацію = НІ при налаштуванні звичайної серії за допомогою STORYBOARDS
Педро Борхес

49

Ви можете зняти прапорець "Анімації" в Interface Builder для iOS 9

введіть тут опис зображення


3
Це відповідь на вихідне питання! Інші відповіді показують, як цього досягти в коді objc / swift, тоді як dtochetto використовує лише Xcode (як це вимагалося в оригінальному запитанні).
drpawelo

однак для розмотуваної сеги це, здається, не спрацьовує
Ніколас Манзіні

2
Це найкраще та найшвидше рішення, на жаль, це не працює на iOS 8.
EricH206

2
@DanielT. Можливо, ви можете перетягнути 2 розділи на розкадрування, в одному є анімація, а в іншому немає анімації. Дайте їм інше Identifierім’я.
AechoLiu

1
Зверніть увагу, що XCode просто додає атрибут елементу segue у файлі .storyboard. Ви можете вручну відредагувати файл .storyboard і додати animates = "NO" до тем, які вас цікавлять, якщо ви використовуєте Visual Studio, а галочка недоступна в конструкторі.
Вес,

35

Відповідь Яна працює чудово!

Ось швидка версія Segue, якщо кому це потрібно:

ОНОВЛЕНО ДЛЯ SWIFT 5, ТРАВЕНЬ 2020

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 мені знадобилося "як!" замість "як" у двох місцях, якими ви їх використовуєте.
Карлос,

1
Хм, можливо, в Swift 1.2? Я перевірив Swift 2.0 у Xcode 7 Beta1, і він скомпілювався без будь-яких попереджень.
zavié

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

Сподіваюся, це допомагає комусь іншому!


Ви можете просто додати це до дії кнопки UIB або чого завгодно. Якщо ви хочете перейти до нового контролера перегляду без анімації, ви можете використовувати: - void (yourUIButtonAction) {CreditsViewController * creditspage = [self.storyboard instantiateViewControllerWithIdentifier: @ "Credits"]; [self.navigationController pushViewController: анімована сторінка кредитів: НІ]; }
Річард

Це навіть не відповідає на питання. Ви тут не використовуєте segue!
KIDdAe,

4

Ось версія 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)
    }

}

1
Цей код скопійовано з відповіді @ zavié, нічого не додаючи, але справді гірше: жодної перевірки на наявність не включених
Дієго Френіче

Це відрізняється від відповіді @ zavié, оскільки він показує, як модально представити ViewController без анімації. Приємно мати його тут як посилання, оскільки він дещо пов'язаний з питанням.
Дрейк

2

відповідь за допомогою 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)
    }
}

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

Не забувайте, що вам все ще потрібно встановити власну сегу на вашій дошці розповідей і встановити клас для класу PushNoAnimationSegue.


0

Для мене найпростіший спосіб зробити це:

UIView.performWithoutAnimation { 

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

    }

Доступно з iOS 7.0


Якщо я використовую адаптивні сегменти, я вважаю, що, хоча performWithoutAnimation вимикає анімацію, перед виконанням сегмента анімації знову вмикаються, якщо в сезі встановлено прапорець "анімація". Після виконання, однак, він знову їх відключає, якщо раніше були.
malhal

Але ви можете обійти це, створивши підклас UIStoryboardSegue і знову відключивши анімацію перед виконанням (наприклад, за допомогою конструктора, щоб перевірити, чи вони відключені, і зберегти його у властивості).
malhal

0

Я використовую Visual Studio з Xamarin, і дизайнер не надає прапорця "Анімує" у відповіді dtochetto.

Зверніть увагу, що дизайнер XCode застосує наступний атрибут до елемента segue у файлі .storyboard: animates = "NO"

Я вручну відредагував файл .storyboard і додав animates = "NO" до елемента (-ів) segue, і він працював у мене.

Приклад:

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

Використання : Встановіть клас розмови з розкадрування, як показано на малюнку. встановіть для isAnimationRequired від вашого контролера перегляду значення false, звідки ви хочете зателефонувати виконувати Seegue, коли ви хочете натиснути segue без анімації та встановити значення true після виклику self.performSegue. Удачі....

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

встановіть клас розмови з розкадрування, як показано на малюнку.


-1

Просто встановіть animated БРЕХНЯ на UINavigationController.pushViewControllerв Swift

self.navigationController!.pushViewController(viewController, animated: false)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.