UIPanGestureRecognizer没有启动。 Swift 3

我的视图层次如下:

  • 视图

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

在viewDidLoad中,我为emojis创buildUIImageViews,将它们添加到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 } 

问题:平底锅function没有启动。 旋转和捏合作品。 但是平移不是。 (因为它有button,所以不能禁用叠加视图的用户交互)

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

1:您还可以在故事板中设置捏,平移和旋转手势识别器。 这些可能是多余的。 只要提一下。 这真的不是你的平移手势识别器不工作的问题。

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

我用这样的方式修改了故事板,在那个时候我可以得到平移的手势。 请让我知道,如果你需要我澄清任何事情,因为我不知道我是否足够清楚的问题:)

注意:在修复上述问题时遇到的一个问题是,您将发现并非所有触摸都会注册,因为手势识别器已附加到每个贴纸上,而贴纸本身可能太小而无法检测到捏手势。 在添加viewForImgAndEmoji作为手势处理程序,并且在尝试捏,旋转或平移之前,根据点击select表情符号来激活每个贴图/表情符号作为手势的接收者可能会更好。 只是一个build议:)

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

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