如何排除子视图的手势?
How to Exclude gesture for subview?
我正在使用一个在图像视图中获取签名的应用程序。我使用 SWRevealViewController 作为侧边菜单。我的应用看起来像这样。
class CaptureSignature: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate,UIGestureRecognizerDelegate {
我正在编写下面的代码以显示侧边菜单
override func viewDidLoad() {
super.viewDidLoad()
let revealViewController = self.revealViewController()
menuBtn.addTarget(revealViewController, action: #selector(SWRevealViewController.rightRevealToggle(_:)), for: .touchUpInside)
revealViewController?.panGestureRecognizer()?.isEnabled = true
}
现在我的问题是,当我在图像视图上从右向左滑动时,没有画一条线,而是打开了侧边菜单。(因为我在 SWRevealViewController 中启用了 panGesture)。
我不想要的是,当我向右滑动时,我不想在 imageView 上启用滑动手势来显示菜单栏。我写了下面的函数,但它不起作用(即使我在其中放置断点时它也没有进入方法)
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
if let touchedView = touch.view, touchedView.isDescendant(of: imageView) {
print("touched in image view")
return false
}
return false
}
谁能帮帮我。
您是否尝试过在 UIImageView 上将 isUserInteractionEnabled
设置为 true
?
如果要针对特定视图禁用手势。
self.<yourview>.isUserInteractionEnabled = false
您可以在 Reveal 控制器上调整 属性。
revealController.draggableBorderWidth = # Your Value #
如果触摸开始小于该值,将限制显示控制器启动平移手势。
就像你的情况一样,如果你的图像视图 x 位置是 50。所以你可以将这个 属性 设置为 40。当用户触摸位置小于 40 时,平移手势将起作用。默认情况下,它的值为 0,这就是为什么平移手势从任何地方开始。
SWRevealViewController 提供此功能。写吧
revealViewController().panGestureRecognizer().isEnabled = false
在您要禁用打开菜单功能的控制器中。
您可以使用以下方法忽略特定区域的滑动手势。
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool
你仍然可以打电话给 touchesMoved
来画你的签名。这是示例代码。
func addSwipeGesture() {
let leftSwipe = UISwipeGestureRecognizer(target: self, action:
#selector(handleSwipes(_:)))
leftSwipe.delegate = self
let rightSwipe = UISwipeGestureRecognizer(target: self, action:
#selector(handleSwipes(_:)))
rightSwipe.delegate = self
leftSwipe.direction = .left
rightSwipe.direction = .right
self.view.addGestureRecognizer(leftSwipe)
self.view.addGestureRecognizer(rightSwipe)
}
@objc func handleSwipes(_ sender:UISwipeGestureRecognizer) {
if (sender.direction == .left) {
print("Swipe Left")
}
if (sender.direction == .right) {
print("Swipe Right")
}
}
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive
touch: UITouch) -> Bool {
return !self.imgView.bounds.contains(touch.location(in: self.imgView))
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
print("moving")
}
对于上面的代码片段,滑动将在图像视图中被忽略,即 imgView
我正在使用一个在图像视图中获取签名的应用程序。我使用 SWRevealViewController 作为侧边菜单。我的应用看起来像这样。
class CaptureSignature: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate,UIGestureRecognizerDelegate {
我正在编写下面的代码以显示侧边菜单
override func viewDidLoad() {
super.viewDidLoad()
let revealViewController = self.revealViewController()
menuBtn.addTarget(revealViewController, action: #selector(SWRevealViewController.rightRevealToggle(_:)), for: .touchUpInside)
revealViewController?.panGestureRecognizer()?.isEnabled = true
}
现在我的问题是,当我在图像视图上从右向左滑动时,没有画一条线,而是打开了侧边菜单。(因为我在 SWRevealViewController 中启用了 panGesture)。
我不想要的是,当我向右滑动时,我不想在 imageView 上启用滑动手势来显示菜单栏。我写了下面的函数,但它不起作用(即使我在其中放置断点时它也没有进入方法)
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
if let touchedView = touch.view, touchedView.isDescendant(of: imageView) {
print("touched in image view")
return false
}
return false
}
谁能帮帮我。
您是否尝试过在 UIImageView 上将 isUserInteractionEnabled
设置为 true
?
如果要针对特定视图禁用手势。
self.<yourview>.isUserInteractionEnabled = false
您可以在 Reveal 控制器上调整 属性。
revealController.draggableBorderWidth = # Your Value #
如果触摸开始小于该值,将限制显示控制器启动平移手势。 就像你的情况一样,如果你的图像视图 x 位置是 50。所以你可以将这个 属性 设置为 40。当用户触摸位置小于 40 时,平移手势将起作用。默认情况下,它的值为 0,这就是为什么平移手势从任何地方开始。
SWRevealViewController 提供此功能。写吧
revealViewController().panGestureRecognizer().isEnabled = false
在您要禁用打开菜单功能的控制器中。
您可以使用以下方法忽略特定区域的滑动手势。
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool
你仍然可以打电话给 touchesMoved
来画你的签名。这是示例代码。
func addSwipeGesture() {
let leftSwipe = UISwipeGestureRecognizer(target: self, action:
#selector(handleSwipes(_:)))
leftSwipe.delegate = self
let rightSwipe = UISwipeGestureRecognizer(target: self, action:
#selector(handleSwipes(_:)))
rightSwipe.delegate = self
leftSwipe.direction = .left
rightSwipe.direction = .right
self.view.addGestureRecognizer(leftSwipe)
self.view.addGestureRecognizer(rightSwipe)
}
@objc func handleSwipes(_ sender:UISwipeGestureRecognizer) {
if (sender.direction == .left) {
print("Swipe Left")
}
if (sender.direction == .right) {
print("Swipe Right")
}
}
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive
touch: UITouch) -> Bool {
return !self.imgView.bounds.contains(touch.location(in: self.imgView))
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
print("moving")
}
对于上面的代码片段,滑动将在图像视图中被忽略,即 imgView