仅在视图的一部分上接收轻击手势

时间:2013-06-26 04:11:58

标签: ios map uiimageview uitapgesturerecognizer

我在视图控制器中有一个UIImageView。是否可以使图像视图的某些区域可以进行处理?

示例:我有一张地图图片。只允许POI可点击。不是整个形象。这可能吗?

4 个答案:

答案 0 :(得分:14)

您可以使用 handleGesture 方法。首先,您需要创建一个接收触摸的位置,您必须将其与委托方法中的触摸位置进行比较,如下所示:

CGRect locationRect;

在viewdidload中

locationRect = CGRectMake(CREATE A FRAME HERE);

下一个委托方法

- (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer {
    CGPoint p = [gestureRecognizer locationInView:self.view];
    if (CGRectContainsPoint(locationRect, p)) {
        NSLog(@"it's inside");
    } else {
        NSLog(@"it's outside");
    }
}

答案 1 :(得分:2)

是的,这是可能的,但你应该问问自己是否值得。如果是我,我会在地图上添加一个兴趣点对象,并将手势识别器附加到那个。但是,如果您想转到其他路线,可以查看UIGestureRecognizerDelegate

的以下方法
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch

这将说明手势是否应该处理给定的触摸。您可以根据您的POI过滤它。

答案 2 :(得分:1)

感谢manujmv,我能够找出自定义手势区 Swift 3 实现。在我的情况下,我在窗口的每一侧创建50个点条带,以便从一个VC移动到另一个VC。但是将其重用于任何其他应用程序应该非常容易:

class ViewController: UIViewController {
   ...
   var mySensitiveArea: CGRect?
   ...
   override func viewDidLoad() {
   ...
   let screenWidth = UIScreen.main.bounds.size.width
   let screenHeight = UIScreen.main.bounds.size.height
   mySensitiveArea = CGRect(0, 0, 50, screenHeight)
   let swipeGesture = UISwipeGestureRecognizer(target: self, action: #selector(self.handleGesture(_:)))
   swipeGesture.direction = UISwipeGestureRecognizerDirection.right
   self.view.addGestureRecognizer(swipeGesture)
   }
}

//Function for determining when swipe gesture is in/outside of touchable area
func handleGesture(_ gestureRecognizer: UIGestureRecognizer) {
    let p = gestureRecognizer.location(in: self.view)
    if mySensitiveArea!.contains(p) {
        print("it's inside")
        showMainViewController()
    }
    else {
        print("it's outside")
    }
}

//Segue to Main VC
func showMainViewController() {
    self.performSegue(withIdentifier: "toMain", sender: self)
}

答案 3 :(得分:0)

是的,我可以帮助你。最近我试图创建一个自定义segmentedControl,其中我有三个视图。

当我接触到第一视图时,tapGesture工作了。但剩下的一半回应了。我查了一下,结果对你现在很有用。

我的细分框架是:

  

segment.frame = CGRectMake(0,0,300,100);

UIView的框架是:

  

view1 = [[UIView alloc] initWithFrame:CGRectMake(10,80,100,40)];

然后我将帧的高度更改为200然后它工作:

  

segment.frame = CGRectMake(0,0,300,200);

**因此,如果您想要拍摄,只需要对您的视图进行识别,减少您的框架的高度**