我正在使用普通的故事板,并在xcode中推送segues,但是我想让segues仅出现在下一个视图中,而不是滑动下一个视图(例如,当您使用选项卡栏并且仅出现下一个视图时)。
有没有一种简单的好方法就可以使普通的推送序列仅“显示”而不是“滑动”,而无需添加自定义序列?
一切工作都很好,我只想删除视图之间的幻灯片动画。
我正在使用普通的故事板,并在xcode中推送segues,但是我想让segues仅出现在下一个视图中,而不是滑动下一个视图(例如,当您使用选项卡栏并且仅出现下一个视图时)。
有没有一种简单的好方法就可以使普通的推送序列仅“显示”而不是“滑动”,而无需添加自定义序列?
一切工作都很好,我只想删除视图之间的幻灯片动画。
Answers:
我能够通过创建自定义segue来做到这一点(基于此link)。
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
名字。
伊恩的答案很棒!
如果有人需要,这是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];
希望这对别人有帮助!
这是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)
}
}
使用Swift3回答-
对于“推送” 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)
}
}
对于使用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文件,并将animates =“ NO”添加到segue元素,它对我有用。
例:
<segue id="1234" destination="ZB0-vP-ctU" kind="modal" modalTransitionStyle="crossDissolve" animates="NO" identifier="screen1ToScreen2"/>
无需动画即可推送: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类,如图所示。当您想在没有动画的情况下推送segue,并在调用self.performSegue之后将其设置为true时,将viewController中的isAnimationRequired设置为false。祝你好运...
DispatchQueue.main.async {
self.isAnimationRequired = false
self.performSegue(withIdentifier: "showAllOrders", sender: self);
self.isAnimationRequired = true
}