使用Swift从一个ViewController滑动到另一个ViewController

时间:2014-08-25 17:47:10

标签: uiviewcontroller uiscrollview swift swipe

我目前正在尝试使用Swift将不同的ViewControllers相互连接,但我感到困惑,并希望得到一些帮助才能继续。

我现在拥有的是一个主视图,当您向右滑动时,您将进入另一个视图(如Snapchat工作)。我使用找到的here教程完成了这项工作。

基本上我有一个ContainerViewController,它在视图层次结构中存储两个子视图。所以我可以在子视图1和子视图2之间来回滑动(参见插图的想法)。子视图2有一个按键“按”模式'加载另一个ViewController。我的问题是,如果有可能的话,我怎么能这样做,以便当我在"模态ViewController"中向左滑动时我会刷回Subview 1?

Image

这是我的代码,它控制从Subview 2(BViewController)和模态ViewController(InfoVC)的转换:

class BViewController: UIViewController, UITabBarDelegate {

    @IBOutlet var item: UIBarButtonItem!
    var info: InfoVC = InfoVC(nibName: "InfoVC", bundle: nil )

    func tabBar( tabBar: UITabBar!, didSelectItem item: UITabBarItem!){
        if item.tag == 2{ // we are in new view controller
            info.modalTransitionStyle = UIModalTransitionStyle.CrossDissolve
            self.presentViewController(info, animated: true, completion: nil)
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        println("info hash \(info.hashValue)")
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

这是我的ContainerViewController类,其中包含ScrollView / swipe机制。

class ContainerViewController: UIViewController {

    // Outlet used in storyboard
    @IBOutlet var scrollView: UIScrollView?;

    override func viewDidLoad() {
        super.viewDidLoad();

        // 1) Create the three views used in the swipe
        var AVc: AViewController = AViewController(nibName: "AViewController", bundle: nil)
        var BVc: BViewController = BViewController(nibName: "BViewController", bundle: nil)

        // 2) Add in each view to the container view hierarchy
        //    Add them in opposite order since the view hieracrhy is a stack

        self.addChildViewController(BVc);
        self.scrollView!.addSubview(BVc.view);
        BVc.didMoveToParentViewController(self);

        self.addChildViewController(AVc);
        self.scrollView!.addSubview(AVc.view);
        AVc.didMoveToParentViewController(self);

        // 3) Set up the frames of the view controllers to align
        //    with eachother inside the container view
        var adminFrame :CGRect = AVc.view.frame;
        adminFrame.origin.x = adminFrame.width;
        BVc.view.frame = adminFrame;

        var BFrame :CGRect = BVc.view.frame;
        BFrame.origin.x = 2*BFrame.width;

        // 4) Finally set the size of the scroll view that contains the frames
        var scrollWidth: CGFloat  = 2 * self.view.frame.width
        var scrollHeight: CGFloat  = self.view.frame.size.height
        self.scrollView!.contentSize = CGSizeMake(scrollWidth, scrollHeight);
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

总结:

我可以做的是从AViewController滚动到BViewController(来回),然后按Tab键项目/按钮从BViewController转到InfoVC。我当时无法弄清楚的是在InfoVC中向后滑动并使用与在AViewController和BViewController之间滑动时相同的转换到达AViewController。

3 个答案:

答案 0 :(得分:0)

您需要向InfoVC添加UISwipeGestureRecognizer。在Interface Builder中,最简单的方法是将对象库中的一个拖到InfoVC上。您将看到它的新图标显示在IB场景顶部的工具栏中。选择它,然后在“属性”检查器中,选择要滑动的方向 - 在您的情况下,它可能是从左到右。

接下来,在InfoVC中实施touchesBegan()touchesEnded()方法,并使用事件的位置来确定用户是否刷过了您在起点和终点之间指定的距离。如果touchesEnded()距离至少有一段距离,那么您可以通过从其父级BViewController中删除它来解散您的InfoVC。

答案 1 :(得分:0)

  1. 从故事板中加载ViewController
  2. 将BViewController嵌入UINavigation控制器。
  3. 这将允许您以故事板的方式进行所有细分

    // lets try to load them from the storyboard
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let navigationController = storyboard.instantiateViewControllerWithIdentifier("navController") as UINavigationController
    var BVc = navigationController
    
  4. 这将是一个很好的第一步。在你的BVc准备Segue启用和禁用滚动,因为它会干扰containerviews刷卡。在您的BVc视图中确实可以看到它。

    var parentVC = self.navigationController?.parentViewController as ContainerViewController
    parentVC.scrollView?.scrollEnabled = false
    

    我可能不得不做一些额外的工作来重新接收模式中的滑动事件,我不确定。

答案 2 :(得分:0)

我建议使用UIPageViewController,它是为这样的任务创建的,你可以通过删除这些方法隐藏点条:

presentationCountForPageViewController
presentationIndexForPageViewController

要使按钮起作用,您需要添加:

func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [AnyObject], transitionCompleted completed: Bool) {

这是一个很好的教程:

https://www.youtube.com/watch?v=8bltsDG2ENQ