我读过segues上的其他帖子,但没有一篇能解决我的问题.

简单地说,我的ViewController个是订购的,就像一本书.我想要从左到右的向后过渡(例如:从第9页到第8页)到始终呈现(滑动).我想要从右到左的前向过渡(从第9页到第10页).

是的,我的导航控制器后退按钮(左上角)是这样显示的,如果你一页一页地翻页.然而,如果你从一个索引跳入,那么导航控制器上的返回功能会将你带回索引.

我的目标是,如果用户从索引跳转到第9页(例如),然后向右滑动,它会将页面向右滑动,并显示第8页.一旦进入第8页,如果他们向左轻弹,页面将向左轻弹,他们将再次进入第9页.

默认情况下,我所有的ViewController都是通过从右向左滑动来呈现的.

例子:

最后的例子

细节:

  1. 我使用的是导航控制器,用于左上角的"后退"按钮功能.它使用导航堆栈,工作正常.

  2. 不过,我在底部有自己的自定义导航栏(后退按钮、主页按钮、索引按钮、前进按钮)和手势.这些就是我想要的书一样的功能.

  3. 用swift编码.

  4. 使用Xcode 6.3

我读过动画代码.我读过一些可以使用的深入编程转换.似乎很疯狂,没有简单的方法可以从左边选择我想要呈现的片段,然后轻松反转动画.

谢谢!

try 日志(log):

I tried DCDC's code:
    UIView.transitionWithView(self.window!, duration: 0.5, options:.TransitionFlipFromLeft, animations: { () -> Void in
            self.window!.rootViewController = mainVC
            }, completion:nil)

当我将DCDC的代码插入IBAction以进行背面滑动时,会返回此错误

This error is returned when I insert DCDC's code into an IBAction for my back-swipe

推荐答案

这就是我在不需要导航控制器的情况下实现效果的方法.试试这个:

Swift 4:

import UIKit
class SegueFromLeft: UIStoryboardSegue {
    override func perform() {
        let src = self.source
        let dst = self.destination

        src.view.superview?.insertSubview(dst.view, aboveSubview: src.view)
        dst.view.transform = CGAffineTransform(translationX: -src.view.frame.size.width, y: 0)

        UIView.animate(withDuration: 0.25,
                              delay: 0.0,
                            options: .curveEaseInOut,
                         animations: {
                                dst.view.transform = CGAffineTransform(translationX: 0, y: 0)
                                },
                        completion: { finished in
                                src.present(dst, animated: false, completion: nil)
                                    }
                        )
    }
}

Swift 3:

import UIKit

class SegueFromLeft: UIStoryboardSegue
{
    override func perform()
    {
        let src = self.sourceViewController
        let dst = self.destinationViewController

        src.view.superview?.insertSubview(dst.view, aboveSubview: src.view)
        dst.view.transform = CGAffineTransformMakeTranslation(-src.view.frame.size.width, 0)

        UIView.animateWithDuration(0.25,
            delay: 0.0,
            options: UIViewAnimationOptions.CurveEaseInOut,
            animations: {
                dst.view.transform = CGAffineTransformMakeTranslation(0, 0)
            },
            completion: { finished in
                src.presentViewController(dst, animated: false, completion: nil)
            }
        )
    }
}

然后在故事板中,点击你想要改变的片段.在属性判断器中,将类型更改为"Custom",并将类更改为"SegueFromLeft"

Swift相关问答推荐

如何自己快速编写 Hashable 协议

Swift中的分段错误

如何从 Swift 中的字符串中删除变音符号?

否定 #available 语句

SwiftUI:如何让 TextField 成为第一响应者?

新项目的 SwiftUI 2.0 CoreData 问题 - '在范围内找不到类型'项目''

SwiftUI 中的 .primary 和 .secondary colored颜色 是什么?

SwiftUI HStack 以等间距填充整个宽度

SwiftUI:如何弹出到根视图

找不到目标“x86_64-apple-ios-simulator”的模块

RunLoop 与 DispatchQueue 作为调度程序

SwiftUI:可以从任何视图触发的全局叠加层

SwiftUI 中文本的自定义字体大小

在现有的 UIKit 应用程序中包含 SwiftUI 视图

什么使 SwiftUI 的 DSL 成为可能?

Xcode 和 Swift - 没有标题栏但有关闭、最小化和调整大小按钮的窗口

哪些版本的 Xcode 支持哪些版本的 Swift?

iOS:检测设备是否为 iPhone X 系列(无框)

AVAudioSession setCategory Swift 4.2 iOS 12 - 静音播放声音

Firebase InstanceID.instanceID().token() 方法已弃用