【问题标题】:Implementing Gesture Recognizer as Segue Between Two View Controllers将手势识别器实现为两个视图控制器之间的 Segue
【发布时间】:2016-10-15 00:26:20
【问题描述】:

我正在构建一个名为 Single Photo 的应用程序。它是 Apple 的“Learn to Code”iBook 的一部分。我已经构建了原始应用程序,但现在想对其进行扩展。

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

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

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

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

【问题讨论】:

    标签: ios swift xcode uiviewcontroller uigesturerecognizer


    【解决方案1】:

    我会为此使用滑动手势;对我来说,通过触摸改变视图似乎是最自然的一种方式?

    虽然遗憾的是我还不了解 Swift,但我会这样做;

    1. 使用 Interface Builder 将手势识别器对象添加到您的视图中。您可以在要添加的对象列表中找到它(标签、文本字段等)。

    2. 在您的 ViewController.m 中添加一个 IBAction 方法,并在您的 .h 中声明它,例如:

    - (IBAction)handleSwipe:(UISwipeGestureRecognizer *)recognizer

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

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

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

      [self performSegueWithIdentifer:@"theSegue" sender:self];

    看看能不能带你去那里

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

        tl;dr:您将编写一个交互式自定义视图控制器过渡动画

        【讨论】:

        【解决方案4】:

        在情节提要中创建一个从初始视图控制器到新视图控制器的转场。然后单击它并将标识符设置为某个值。将前三行代码放在初始控制器的 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)
        }
        

        【讨论】:

          【解决方案5】:

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

          首先要了解如何使用 UIGestureRecognizer,这样当用户点击、长按、旋转、捏合等某个视图时,您可以执行不同的操作。然后,如果你想让 ViewController 之间的过渡看起来与平常不同并添加一个很酷的效果,你需要了解更多关于 UIViewControllerAnimatedTransitioning 的信息,这里有一个很棒的教程:APPCODA's Introduction to Custom View Controller Transitions and Animations.

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

            1. 假设您有两个 ViewController,分别称为 MainVC 和 SecondaryVC,并且您希望在用户执行某个手势后从一个切换到另一个。正如您之前提到的,您可以在它们之间创建一个转场并为其设置一个标识符(以便您稍后可以在代码中执行转场),您可以通过单击情节提要中的转场并转到属性检查器来执行此操作。对于这个例子,让我们将标识符设置为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,并且您可以通过执行与我们在此示例中所做的非常相似的操作来处理其他支持的手势。希望对您有所帮助!祝你好运!

          【讨论】:

          • 如何设置segue的标识符?当我点击 MainVC 上的滑动手势识别器图标时,我看不到添加标识符的位置,只有“滑动”和“触摸”字段。
          • 因此您不必点击滑动手势识别器,而是点击情节提要中的实际转场(从一个 VC 指向另一个 VC 的箭头)。然后你转到屏幕右侧并进入属性检查器,会有一个名为“标识符”的文本字段,你在那里写下你的标识符的名称。
          猜你喜欢
          • 1970-01-01
          • 2015-06-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-29
          相关资源
          最近更新 更多