iOS Segue - 从左到右 -

Dav*_*e G 40 uiviewanimation ios segue swift xcode6

我已经阅读了有关segues的其他帖子但没有解决我的问题.

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

是的,如果您逐页翻页,我的导航控制器后退按钮(左上角)会显示如下内容.但是,如果从索引中跳转,则导航控制器上的后退功能会将您带回索引.

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

ViewController默认情况下,我所有人都是从右到左滑动.

示例:将其想象成一本书,如果我使用索引跳到第4章,然后向右滑动并从堆栈中弹出一个视图,我将回到索引.但是,如果您使用第394章第4章并向右滑动,则不希望返回索引!您想要转到第393页第3章的最后一页!因此导航堆栈对我没有帮助.

结束例子

详细信息:1.我在按钮上使用新的Xcode"Show"在ViewControllers之间切换.

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

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

  3. 快速编码.

  4. 使用Xcode 6.3

我读过有动画代码.我已经阅读了可以使用的深度程序转换.只是选择我想要从左边呈现的segue并轻松地反转动画,这似乎很疯狂.

谢谢!

尝试记录:

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

当我将DCDC的代码插入到IBAction我的后滑动中时,会返回此错误

当我将DCDC的代码插入IBAction进行反刷时,会返回此错误

Mic*_*son 87

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

斯威夫特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)
                                    }
                        )
    }
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特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)
            }
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在故事板中,单击您要更改的segue.在属性检查器中,将类型更改为"自定义"并将类更改为"SegueFromLeft"

  • 值得注意的是,只有使用此解决方案,我才能真正实现"fromLeft"转换.在接受的答案中,新视图从按钮向上推,而旧视图则向右推.在此解决方案中,旧视图保持其位置,而新视图从左侧推入. (5认同)
  • 就像@chuky一样,这个解决方案应该是公认的答案.我遇到了与BenNov类似的问题,动画会播放,但控制器仍然会从底部出现 (3认同)
  • 要进行"fromRight"转换,只需删除减号,这样就应该是`dst.view.transform = CGAffineTransformMakeTranslation(src.view.frame.size.width,0)` (3认同)
  • @MichaelHudson,我制作了一个新的类文件,并且有效.但是,现在所有其他segue都使用bottom-top,除了我设置自定义segue的那个.在它左右之前,那是什么意思?编辑:似乎它在我点击使用自定义segue的按钮后立即开始使用bottom-top segue - 然后所有其余的将是bottom-top除了segue与自定义的. (2认同)

ram*_*ssa 42

这是一个自定义segue类,可用于在Swift中执行从左到右的segue.它需要QuartzCore框架和最小的动画.

Swift 2.2

import UIKit
import QuartzCore

class SegueFromLeft: UIStoryboardSegue {

    override func perform() {
        let src: UIViewController = self.sourceViewController
        let dst: UIViewController = self.destinationViewController
        let transition: CATransition = CATransition()
        let timeFunc : CAMediaTimingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
        transition.duration = 0.25
        transition.timingFunction = timeFunc
        transition.type = kCATransitionPush
        transition.subtype = kCATransitionFromLeft
        src.navigationController!.view.layer.addAnimation(transition, forKey: kCATransition)
        src.navigationController!.pushViewController(dst, animated: false)
    }

}
Run Code Online (Sandbox Code Playgroud)

Swift 3.0

import UIKit
import QuartzCore

class SegueFromLeft: UIStoryboardSegue {

    override func perform() {
        let src: UIViewController = self.source
        let dst: UIViewController = self.destination
        let transition: CATransition = CATransition()
        let timeFunc : CAMediaTimingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
        transition.duration = 0.25
        transition.timingFunction = timeFunc
        transition.type = kCATransitionPush
        transition.subtype = kCATransitionFromLeft
        src.navigationController!.view.layer.add(transition, forKey: kCATransition)
        src.navigationController!.pushViewController(dst, animated: false)
    }
}
Run Code Online (Sandbox Code Playgroud)

"后退"按钮仍将显示在转换视图控制器的导航栏中,但您可以轻松地禁用/配置该视图控制器的导航控制器.

  • 如果有人读这篇文章,希望同样的功能,但你的应用程序不使用导航控制器,只需修改两个底线:src.view.layer.addAnimation(过渡,forKey:kCATransition)src.presentViewController(DST,动画:true,完成:nil)我的新应用程序没有导航控制器,但我仍然希望使用此代码轻松添加所需的动画,调整这些行是它所需的全部.再次感谢@Michael在一个月复杂的答案后来救援! (4认同)

Mar*_*sso 11

更新了Swift 3中接受的答案:

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: UIViewAnimationOptions.curveEaseInOut,
            animations: {
                dst.view.transform = CGAffineTransform(translationX: 0, y: 0)
            },
            completion: { finished in
                src.present(dst, animated: false, completion: nil)
            }
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @dorydaniel创建一个名为SegueFromLeft.swift的新类并将代码复制到那里.在故事板中,使用身份检查器检查所需的segue,并将其自定义类设置为SegueFromLeft.瞧! (2认同)