【问题标题】:Receive tap gestures only on part of a view仅在部分视图上接收点击手势
【发布时间】:2013-06-23 01:57:15
【问题描述】:

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

示例:我有一张地图的图像。仅使 POI 可点击。不是整个图像。这可能吗?

【问题讨论】:

  • 您可以在该区域添加UIView 并将其颜色赋予clearColor 并在其上添加tapGesture ...
  • 我已经尝试过这种方法 :) 问题是,如果我放大图像,当图像调整大小时,视图会保持不变。我以这种方式遇到的另一个问题是,如果我在滚动视图中有更大的图像,如果我在 UIScrollView 上放置一个 UIView,滚动将停止工作。
  • 您可以在放大或缩小后计算该视图的框架...通过缩放比例获得多个高度和宽度..您必须在这里做一些逻辑:)

标签: ios map uiimageview uitapgesturerecognizer


【解决方案1】:

您可以使用 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");
    }
}

【讨论】:

  • 这个答案太甜了,我现在有糖尿病。
【解决方案2】:

感谢 manujmv,我能够弄清楚 Swift 3 实现 Custom Gesture Area。在我的例子中,我在窗口的每一侧创建了 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】:

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

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
    

    这将说明手势是否应该处理给定的触摸。您可以根据您的兴趣点对其进行过滤。

    【讨论】:

      【解决方案4】:

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

      当我触摸视图的前半部分时,tapGesture 起作用了。但剩下的一半没有反应。我检查了它,结果现在对你有用。

      我的段帧是:

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

      而UIView的frame是:

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

      然后我将框架的高度更改为 200 然后它起作用了:

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

      ** 因此,如果您想制作,只需点击识别您的部分视图,降低框架的高度就可以了 **

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-26
        • 1970-01-01
        • 1970-01-01
        • 2013-02-08
        • 1970-01-01
        • 2018-01-11
        相关资源
        最近更新 更多