【问题标题】:Transition Screens from Left to Right?从左到右的过渡屏幕?
【发布时间】:2018-10-29 11:04:55
【问题描述】:

我想创建一个转场。我正在使用斯威夫特。我希望新的视图控制器从左侧滑入。这意味着之前的 View Controller 将从左向右滑出。我已经尝试过 Push、Replace、Present Modally 和 Present as Popover 的 segues,但它们都没有进行从左到右的转换。它们要么具有从右到左的过渡,要么从屏幕底部出现新屏幕。如何进行从左到右的过渡?谢谢。

【问题讨论】:

    标签: ios xcode uiviewcontroller segue uistoryboardsegue


    【解决方案1】:

    您可以编写一个不会太难的自定义过渡,但如果您不想走这条路,这里有一个简单的修复方法,它会起作用。单击转场并取消单击/禁用转场上的动画。然后在 prepareForSegue 中使用它。

      override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if let _ = segue.destination as? NextViewController{
                let trans = CATransition()
                trans.type = kCATransitionMoveIn
                trans.subtype = kCATransitionFromLeft
                trans.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
                trans.duration = 0.35
                self.navigationController?.view.layer.add(trans, forKey: nil)
            }
        }
    

    随意探索 CATransition types 的其他选项。你可以和他们一起玩得很开心。现在我猜你想在下一个视图控制器中按下后退按钮的反向。您将不得不替换后退按钮并拦截没有动画的后按和弹出,以便您可以添加自己的动画。这就是它的样子。

     override func viewDidLoad() {
        super.viewDidLoad()
        self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Back", style: .plain, target: self, action: #selector(backTapped))
    }
    
    @objc func backTapped() {
        let trans = CATransition()
        trans.type = kCATransitionMoveIn
        trans.subtype = kCATransitionFromRight
        trans.duration = 0.3
        self.navigationController?.view.layer.add(trans, forKey: nil)
        navigationController?.popViewController(animated: false)
    }
    

    同样,另一个选项是使用UIViewControllerAnimatedTransitioning,但根据您的技能水平和对动画的舒适度,我发现上述方法很容易实现。

    【讨论】:

    • 我已经在上面实现了你最上面的代码,它可以工作。这种转变与按钮的按下有关。我希望这个转换速度与每当从此视图控制器按下后退按钮时发生的转换速度相同。你知道从 Back Button 过渡的速度是多少吗?
    • 概率 0.5 秒
    • 我已经尝试了 0.5 秒。与“后退”按钮相比,它有点太慢了。
    • 编辑添加动画曲线。也许试试 0.35
    • 所以我实际上最终做的是使用 navigationController.popViewController 方法。这样,转换速度与按下后退按钮时的速度相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    相关资源
    最近更新 更多