在两个视图控制器之间实现手势识别器

时间:2016-10-15 00:26:21

标签: ios swift xcode uiviewcontroller uigesturerecognizer

我正在构建一款名为Single Photo的应用。它是Apple的“学习编码”iBook的一部分。我已经构建了原始应用程序,但现在想扩展它。

我已经向Main.storyboard添加了第二个View Controller,以及一个UIImageView。但是,我不确定如何将两个视图控制器连接在一起。我知道我必须添加一个segue,但我想使用滑动手势(如照片库)。建议我使用UIPanGestureRecognizer替代UISwipeGestureRecognizer。

我的困惑是我不确定如何实现UIGestureRecognizer。我是否必须将实现为两个视图控制器之间的segue?这是有道理的。

tl; dr:如何在两个视图控制器之间实现UIGestureRecognizer?

编辑:当我做一些更改时,我会看到屏幕截图中显示的错误。 {1}:https://i.stack.imgur.com/JpViy.png {1}

5 个答案:

答案 0 :(得分:1)

我会使用滑动手势;对我来说,用触摸改变观点似乎是最自然的一个?

虽然我遗憾地不认识斯威夫特,但我会这样做;

  1. 使用Interface Builder将手势识别器对象添加到视图中。您可以在要添加的对象列表中找到它(Label,TextField等)。

  2. 在ViewController.m中添加IBAction方法并在.h中声明它也像:

  3. - (IBAction)handleSwipe:(UISwipeGestureRecognizer *)recognizer

    1. 将Interface Builder中的手势识别器连接到IBAction作为“已发送的操作”

    2. 通过按键点击第一个视图控制器并将蓝线拖到第二个视图来创建一个新的Segue。给这个segue一个唯一的标识符并设置segue的样式。

    3. 根据滑动方向处理IBAction中的手势,并从此处调用segue;

      [self performSegueWithIdentifer:@“theSegue”sender:self];

    4. 看看是否能帮助你

答案 1 :(得分:0)

可以使用UIPanGestureRecognizerUISwipeGestureRecognizer来触发视图控制器之间的segue,但它绝不是自动的。

我建议使用UIPageViewController。这是一种父视图控制器,它管理一组子视图控制器,并允许您在它们之间进行分页,如照片库或iBooks

Xcode中内置了一个名为PhotoScroller的演示应用程序,可以为您提供这个想法。在Xcode帮助系统中的PhotoScroller上搜索以查找它。我记得它是用Objective-C编写的,但它至少可以让你了解页面视图控制器的工作原理。

答案 2 :(得分:0)

  

tl; dr:如何将UIGestureRecognizer实现为两个视图控制器之间的隔离?

tl; dr:你会写一个交互式自定义视图控制器转换动画

答案 3 :(得分:0)

我认为这是一个很好的问题,如果分成两个不同的部分,可以得到最好的回答。

首先要了解如何使用UIGestureRecognizer,以便在用户点击,长按,旋转,捏合等特定视图时可以执行不同的操作。然后,如果你想让ViewControllers之间的转换看起来与平常不同并为它添加一个很酷的效果,你需要了解更多关于UIViewControllerAnimatedTransitioning的信息,这里有一个很棒的教程:{{3} }

  • 让我们举个例子,尝试回答你的问题:

    1. 假设您有两个ViewControllers,将它们称为MainVC和SecondaryVC,并且您希望在用户执行某个手势后从一个转换到另一个。如前所述,您可以在它们之间创建一个segue并为其设置标识符(以便稍后可以在代码中执行segue),您可以通过单击故事板中的segue并转到Attributes Inspector来完成此操作。对于此示例,我们将标识符设置为ToSecondaryVC,并在用户向视图中的任何位置向右滑动时执行某些操作。

首先,你需要初始化一个UISwipeGesture对象,所以让我们通过在MainVC类的ViewDidLoad()中添加以下内容来设置手势识别器:

    let swipeGesture = UISwipeGestureRecognizer(target: self, action: #selector(MainVC.handleSwipeGesture(_:)))

    // Adding detection for a right swipe
    swipeGesture.direction = .Right
    view.addGestureRecognizer(swipeGesture)

在此之后你想创建一个函数,在swipeGesture发生后你将在其中执行segue(或其他任何事情)。像这样,

    func handleSwipeGesture(gesture: UISwipeGestureRecognizer) {
        performSegueWithIdentifier("ToSecondaryVC", sender: self)  
    }

我认为这应该用于理解如何使用UIGestureRecognizer,并且您可以通过执行与我们在此示例中所做的非常类似的操作来处理其他支持的手势。希望这对你有所帮助!祝你好运!

答案 4 :(得分:0)

在故事板中创建一个segue,从初始视图控制器到新视图控制器。然后单击它并将标识符设置为某些内容。将前三行代码放在初始控制器的viewDidLoad中,将“MyVC”更改为控制器的类名。然后将方法放入并输入您创建的segue的名称。

let gesture = UISwipeGestureRecognizer(target: self, action: #selector(MyVC.performChange))
gesture.direction = .right
self.view.addGestureRecognizer(gesture)

func performChange() {
    self.performSegue(withIdentifier: "MySegue", sender: nil)
}