【问题标题】:UIPanGestureRecognizer isn't firing up. Swift 3UIPanGestureRecognizer 没有启动。斯威夫特 3
【发布时间】:2017-03-21 23:37:59
【问题描述】:

我的视图层次结构如下:

  • 查看

    • 查看用户的 Img + Emoji (A)
    • 使用 UI 元素查看。 (B)

在 viewDidLoad 中,我为表情符号创建 UIImageViews,将它们添加到 A 并添加手势识别器(平移、捏合、旋转):

 let emojiView = UIImageView(image: emoji)
            emojiView.tag = n
            emojiView.frame = CGRect(x: 153, y: 299, width: 70, height: 70)
            emojiView.isUserInteractionEnabled = true

            let pan = UIPanGestureRecognizer(target: self, action: #selector(self.handlePan(recognizer:)))
            pan.delegate = self
            emojiView.addGestureRecognizer(pan)

            let pinch = UIPinchGestureRecognizer(target: self, action: #selector(self.handlePinch(recognizer:)))
            pinch.delegate = self
            emojiView.addGestureRecognizer(pinch)

            let rotate = UIRotationGestureRecognizer(target: self, action: #selector(self.handleRotate(recognizer:)))
            rotate.delegate = self
            emojiView.addGestureRecognizer(rotate)

稍后,我声明 IBActions:

@IBAction func handlePan(recognizer: UIPanGestureRecognizer) {
    let translation = recognizer.translation(in: self.viewForImgAndEmoji)
    if let view = recognizer.view {
        view.center = CGPoint(x:view.center.x + translation.x,
                              y:view.center.y + translation.y)
    }
    recognizer.setTranslation(CGPoint.zero, in: self.viewForImgAndEmoji)
}

@IBAction func handlePinch(recognizer: UIPinchGestureRecognizer) {

    let pinchPoint = recognizer.location(in: viewForImgAndEmoji)
    let ourEmojiView = viewForImgAndEmoji.hitTest(pinchPoint, with: nil)

    ourEmojiView!.transform = ourEmojiView!.transform.scaledBy(x: recognizer.scale, y: recognizer.scale)
    recognizer.scale = 1

}

@IBAction func handleRotate(recognizer: UIRotationGestureRecognizer){

    let rotatePoint = recognizer.location(in: viewForImgAndEmoji)
    let ourEmojiView = viewForImgAndEmoji.hitTest(rotatePoint, with: nil)

    ourEmojiView!.transform = ourEmojiView!.transform.rotated(by: recognizer.rotation)
    recognizer.rotation = 0
}

问题:pan func 没有启动。旋转和捏合工作。但平移不是。 (因为它有按钮,所以不能禁用用户交互来覆盖视图)

【问题讨论】:

  • 是否有可能得到一个带有代码的小演示项目?在这种情况下,使用复制场景的实际项目进行调试会更容易,因为(除非被忽略的一些简单的东西)其他视图可能会吞噬您的平移手势。或者,您可以尝试使用自己的单个视图(而不是多个叠加视图)复制场景,看看问题是否仍然存在......
  • github.com/flostik2008/Skirt 文件 EmojiVC.swift。谢谢。
  • 现在看看。一旦我发现发生了什么,我会尽快回复您。
  • 我发现了问题并添加了答案,但如果我不清楚发生了什么,请告诉我 - 我可能解释得不够清楚。

标签: ios swift swift3 uigesturerecognizer


【解决方案1】:

好的,我查看了代码,发现了两个可能的问题:

1:您还在情节提要中设置了捏合、平移和旋转手势识别器。这些可能是多余的。只是提到这一点。这确实不是您的平移手势识别器无法正常工作的问题。

2:用于控件的UIView 涵盖了您的表情符号和图像视图,并将接管触摸。您不需要 UI 控件的全屏视图,因为您似乎没有对视图本身做任何事情。相反,您可以简单地将按钮放在主屏幕上viewForImgAndEmoji 上方的正确位置。这样,屏幕上的任何触摸都会到达viewForImgAndEmoji,但您拥有按钮的位置除外。

我以这种方式修改了情节提要,此时我可以很好地处理平移手势。如果您需要我澄清任何事情,请告诉我,因为我不确定我是否对这个问题足够清楚:)

注意:修复上述问题时您会遇到的一个问题是,您会发现并非所有触摸都会注册,因为手势识别器已附加到每个贴纸上,而贴纸本身也可能是小到检测像捏手势这样的东西。您最好将viewForImgAndEmoji 添加为手势处理程序,并在尝试捏合、旋转或平移之前通过点击选择表情符号来激活每个贴纸/表情符号作为手势的接收者。只是一个建议:)

【讨论】:

  • 澄清一下,按钮应该出现在主视图上,但 viewForImgAndEmoji 之上,而不是viewForImgAndEmoji 的子视图 - 这样,按钮仍然不会出现在您最终生成的图像中。
  • 成功了。我还将 viewForImgAndEmoji 注册为手势处理程序,但是,由于该视图还包含用户的 img,它开始与表情符号一起平移/捏合/旋转。因此,我不得不重组我的视图以让用户 img - 在一个单独的视图中。这很容易,因为在您在上一个问题中的解释之后,我现在了解了视图层次结构的工作原理(就我而言)。
  • 很高兴听到您能够让事情顺利进行,并且很高兴能得到一些帮助 :) 祝您使用该应用程序好运,如果您遇到任何问题,请随时联系我!跨度>
【解决方案2】:

您可能需要实现以下委托方法:

public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}

【讨论】:

    猜你喜欢
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多