【问题标题】:Detecting touches on a part of UIImageView检测部分 UIImageView 的触摸
【发布时间】:2012-12-25 09:11:00
【问题描述】:

我有一个图像,它看起来像一个三角形,但它的面积是一个矩形。

在这个图像中有两个块(在图像中用 1 和 2 表示),整个矩形是一个图像视图。

我只想检测图像第一部分的触摸。

只在这部分检测触摸怎么办?

【问题讨论】:

  • 你想在上面“检测”什么?
  • 实际上我只想检测图像部分而不是剩余空间。
  • 我明白了,但是您所说的“检测”它是什么意思?您想将图像剪辑/裁剪到该部分吗?你想知道那个三角形的位置吗?还是什么?
  • 我只想触摸实际图像区域的部分。
  • 那么你可能应该继承 UIView 并覆盖 touchesBegan:withEvent: 等方法。

标签: iphone cocoa-touch uiimageview


【解决方案1】:

正如 H2CO3 所说,您可以继承 UIView(或 UIImageView)并实现 touchesBegan:withEvent: 和 co。 然后测试接触点是否在您感兴趣的区域内。对于您的特定要求(图像的三角形一半),测试非常简单。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
   CGPoint touchPoint = [[touches anyObject] locationInView:self];
   if (touchPoint.x < touchPoint.y)
   {
      // touch in lower triangular half; handle touch however you like
   }
}

如果您是 UIImageView 的子类,请不要忘记将其 userInteractionEnabled 属性设置为 YES。

【讨论】:

  • 作为替代方案,可以简单地将 GestureRecognizer 添加到常规 UIImageView 上,并按照给定的逻辑来测试该区域。 +1 用于起草功能齐全的解决方案。
  • Till 将手势识别器添加到图像视图而不是子类化图像视图的想法更好
【解决方案2】:

UIView 始终是矩形,您无法更改它。但是,您也许可以通过使用CALayer 掩码获得您想要的效果。制作UIView 并对其应用自定义蒙版,其中蒙版中包含适合三角形的数据。那么您在UIView 中输入的任何实际内容都只会在相应的'三角形' 形状区域中可见。

要制作遮罩层,您可以使用 Image(例如 png)或使用 Core Graphics 来绘制三角形。您可以做一些事情:

希望对你有所帮助。

【讨论】:

    【解决方案3】:

    首先将这个UIImage 添加到UIViewController 类中,然后在其中添加这个方法...

    将标签设置为您的UIImageView,如下所示...

     yourImageView.tag = 1;
    

    然后使用下面的方法...

    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
        UITouch *touch = [touches anyObject];
        [touch locationInView:self.view];
        if([touch.view isKindOfClass:[UIImageView class]])
        {
            UIImageView *tempImage=(UIImageView *) touch.view;
            if (tempImage.tag == 1) 
            {
                  ///Image clicked here, Do anything which you want here..your Image detect here...
                  NSLog(@"Image clicked here");
            }
        }
    }
    

    希望对你有帮助

    【讨论】:

    • 感谢您的回答。我做到了,但它检测到整个图像视图,但我不想检测整个图像视图,但只检测图像视图的一部分。
    • 哦,它不适用于此代码,但如果我从我的代码中检测到与图像不同部分的触摸,我会发布..
    【解决方案4】:

    您必须从接触点 (point) 创建一个 90 度三角形,然后您必须计算蓝色角度(首先检查下图)是否大于或小于红色角度。如果是这样,则点在 2 内,否则在 1 内

    快速解决方案:

    func calculateIfPointIsInsideTriangle(point: CGPoint, triangle_h: Float, triangle_w: Float) -> Bool{
    
        //    print ("intrare w=\(triangle_w), h=\(triangle_h), x=\(point.x), y=\(point.y)")
    
        let angle_triangle: Float = atan2f(triangle_h,triangle_w)
    
        let angle_point: Float = atan2f(triangle_h - Float(point.y), triangle_w - Float( point.x))
    
        if angle_point <= angle_triangle {
            //        print ("2")
    
            return true
        }
        //    print ("1")
        return false
    }
    

    希望我没有弄错,因为在我的例子中,三角形在另一边。对于这种情况,您应该使用

    let angle_point: Float = atan2f(triangle_h - Float(point.y), Float( point.x))
    

    注意:iOS坐标系是

    (0,0) 。 . . (1,0)

    .

    .

    .

    (0,1) 。 . . (1, 1)

    这就是为什么要计算 angle_point 你必须使用 triangle_h - Float(point.y)triangle_w - Float( point.x)

    来源:

    https://www.raywenderlich.com/35866/trigonometry-for-game-programming-part-1

    https://gamedev.stackexchange.com/questions/14602/what-are-atan-and-atan2-used-for-in-games

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-15
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多