Push segue в xcode без анимации
Я использую обычную раскадровку и нажимаю сегменты в xcode, но я хочу, чтобы сегменты просто отображались в следующем представлении, а не скользили в следующем представлении (как при использовании панели вкладок и следующем представлении).
есть ли хороший простой способ, чтобы нормальные push-сегменты просто "появлялись", а не "скользили", без необходимости добавлять пользовательские сегменты?
все работает совершенно нормально, я просто хочу удалить эту анимацию слайдов между представлениями.
11 ответов:
я смог сделать это, создав пользовательский сегмент (на основе этой ссылке).
- создайте новый класс segue (см. ниже).
- откройте раскадровку и выберите segue.
- установлен класс
PushNoAnimationSegue
(или как вы это решили назвать).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
ответ Яна отлично работает!
вот быстрая версия 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 }