UIPanGestureRecognizer 没有启动。 Swift 3
UIPanGestureRecognizer isn't firing up. Swift 3
我的视图层次结构如下:
查看
- 查看用户的图片 + 表情符号 (A)
- 查看包含 UI 个元素。 (二)
在 viewDidLoad 中,我为表情符号创建 UIImageView,将它们添加到 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
}
问题:平移功能未启动。旋转和捏的作品。但是平移不是。
(因为它有按钮,所以不能禁用覆盖视图的用户交互)
您可能需要实现以下委托方法:
public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
好的,我看了一下代码,发现了两个可能的问题:
1:您还在情节提要中设置了捏合、平移和旋转手势识别器。这些可能是多余的。只是提一下。这确实不是您的平移手势识别器无法正常工作的问题。
2:控件的 UIView
覆盖了您的表情符号和图像视图,并将接管触摸。您不需要 UI 控件的全屏视图,因为您似乎没有对视图本身做任何事情。相反,您可以简单地将按钮放在主屏幕上 viewForImgAndEmoji
上方的正确位置。这样,屏幕上的任何触摸都可以到达 viewForImgAndEmoji
除了有按钮的地方。
我以这种方式修改了故事板,那时我可以很好地获得平移手势。如果您需要我澄清任何事情,请告诉我,因为我不确定我是否对这个问题足够清楚:)
注意:当您解决上述问题时,您将 运行 遇到的一个问题是,您会发现并非所有触摸都会注册,因为手势识别器已附加到每个贴纸和贴纸本身可能太小而无法检测到诸如捏合手势之类的东西。您最好添加 viewForImgAndEmoji
作为手势处理程序,并在尝试捏合、旋转或平移之前通过点击选择表情符号来激活每个 sticker/emoji 作为手势的接收者。只是一个建议:)
我的视图层次结构如下:
查看
- 查看用户的图片 + 表情符号 (A)
- 查看包含 UI 个元素。 (二)
在 viewDidLoad 中,我为表情符号创建 UIImageView,将它们添加到 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
}
问题:平移功能未启动。旋转和捏的作品。但是平移不是。 (因为它有按钮,所以不能禁用覆盖视图的用户交互)
您可能需要实现以下委托方法:
public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
好的,我看了一下代码,发现了两个可能的问题:
1:您还在情节提要中设置了捏合、平移和旋转手势识别器。这些可能是多余的。只是提一下。这确实不是您的平移手势识别器无法正常工作的问题。
2:控件的 UIView
覆盖了您的表情符号和图像视图,并将接管触摸。您不需要 UI 控件的全屏视图,因为您似乎没有对视图本身做任何事情。相反,您可以简单地将按钮放在主屏幕上 viewForImgAndEmoji
上方的正确位置。这样,屏幕上的任何触摸都可以到达 viewForImgAndEmoji
除了有按钮的地方。
我以这种方式修改了故事板,那时我可以很好地获得平移手势。如果您需要我澄清任何事情,请告诉我,因为我不确定我是否对这个问题足够清楚:)
注意:当您解决上述问题时,您将 运行 遇到的一个问题是,您会发现并非所有触摸都会注册,因为手势识别器已附加到每个贴纸和贴纸本身可能太小而无法检测到诸如捏合手势之类的东西。您最好添加 viewForImgAndEmoji
作为手势处理程序,并在尝试捏合、旋转或平移之前通过点击选择表情符号来激活每个 sticker/emoji 作为手势的接收者。只是一个建议:)