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

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

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

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

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

例子:

最后的例子

细节:

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

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

  3. 用swift编码.

  4. 使用Xcode 6.3

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

谢谢!

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相关问答推荐

如何避免使用DispatchSemaphores时线程爆炸?

如何在Swift中获得与Python相同的HMAC—SHA512签名?

避免嵌套导航TabView

阻塞(受CPU限制的)任务的异步功能?

在按下按钮动画后执行按钮动作

像WebSocket一样接收实时更新,但通过异步/等待或组合

是否可以将具有关联值的枚举强制转换为其类型与关联值匹配的变量?

可以';t在标记为@Observable的类上使用属性包装

Swift ui 转换无法按预期工作

SwiftUI - Select 器没有 Select 值

iOS SwiftUI - 无法转换 ObservedObject 类型的值

带有屏幕参数的 NSWindow 初始化程序在初始化时导致致命错误

故事板未在助手中显示视图控制器

如何快速制作虚线?

Xcode 7.3 Swift 的语法高亮和代码完成问题

否定 #available 语句

无法推断泛型参数的参数

为什么'nil' 与 Swift 3 中的 'UnsafePointer' 不兼容?

使用 DispatchTime.now() + float 延迟?

NSLocationWhenInUseUsageDescription 警告,但我已经添加了